Instagram濾鏡,影視級調色演算法實現
人們樂此不疲地發布自己的照片,其中一個很重要的原因就是Instagram擁有出色的濾鏡,不管照相水平如何,加個濾鏡就能讓照片變得高大上起來。
Instagram有一大堆熱愛攝像的人為它研究各種好看的濾鏡,遠不是在photoshop中簡單調一下顏色曲線就能做到的。
這裡介紹一種易於實現的濾鏡演算法,理論上說,用這種方法可以讓那些專業調色員為你「服務「,得到上千種影視級的調色效果(點擊查看動圖)。
LUT調色
LUT調色是在後期製作時常用到的方法,像Adobe系列軟體、達芬奇等等都支持使用LUT文件。簡單來說,先將相機拍攝的RAW文件轉換到Log圖像(一種高動態的、保留更多信息的格式),然後把專業調色員預先製作好的LUT文件添加到Log圖像上。
▲來源:影視工業網
LUT(Look-Up-Table)即顏色查找表,代表輸入圖像和輸出圖像的顏色映射關係。由於圖像輸出的顏色值無論如何都在0到255範圍內,所以可以預先保存好所有映射,可降低計算成本。
▲來源:GPUGems2
一維的查找表只能處理亮度、對比度、gamma矯正等操作,無法實現一些在多通道上的顏色轉換效果,所以一般都用3d LUT。
▲來源:what-is-a-lut
在具體實現時,我們可以將3d lut轉換成一張圖像上。圖像每行每列各有8個小格,共64格,每個小格解析度為64 x 64。 這表示原來的正方體切成了64份,按序排布在這張512 x 512的cube文件上。
對輸入圖顏色轉換時,以顏色(rgb)的b值作為索引,找到所屬於的小格。
最後根據r和g的值在小格中定位到映射的目標值上(兩個格子上對應的像素進行插值)。
shader實現如下:
(知乎的渣排版,貼圖方便一些了,點擊查看源碼)
在photoshop中給標準的cube圖加上自己想要的LUT效果,就能得到一張新的cube圖,這裡用的效果是ImpulZ里的預置LUT文件。
然後將這張處理過的cube圖像當作查找表,利用上面的演算法,著色器就可以算出輸入圖像各個像素對應的映射值,最終得到相應的濾鏡效果。
只要幾行簡單的代碼以及LUT文件,就能產出各種濾鏡。當然,有些效果光靠這種做法可能還不夠,還需進一步處理。▲幾種不同的Lena效果
參考:GPU GemsLUTs Part 1: What is a LUT?轉載請註明出處,並加上本文鏈接。
——————————————————————————————————————
推薦閱讀:
※2D遊戲開發時有那些驚艷的效果是一定要學會著色器(shader)編程?
※編寫Unity Shader的時候,語義POSITION和SV_POSITION的區別?
※Shader model 5.0 的片段著色器能不能得到該片段所在的三角圖元實際光柵化後有多少像素?
※為什麼半透明模型的渲染要使用深度測試而關閉深度寫入?
※iOS 9 用的是哪種模糊演算法?