在幾年前寫的一篇關於BEEP的文章時,我曾經說過Beep的去噪做用能夠用於磨皮,而且給出告終論BEEP比可牛和美圖等的效果要更爲好,如今看來,那個結論確實是太爲誇張和固定了。不一樣的人的審美觀不一樣,同一我的在不一樣時段審美觀也會有所差別,如今看來,我到時以爲可牛影像的帶有膚質保留效果的磨皮更加天然,也更加符合實際的狀況。html
在前段日子裏,又隨意的百度了下PS的磨皮教程,看到了不少的曾經看過的例子,也看到了一些當時不覺得然的文章。其中就包括http://www.missyuan.com/thread-468975-1-1.html這裏講的流程,由於看到其第二步爲:算法
二、用插件磨皮編程
這一步很重要,直接影響最終效果,磨光一些,不要擔憂紋理。函數
平湖老師可能用的NeatImage,我這裏使用的是Portraiture, 把紅框內的滑塊都拉到最大。測試
當時本身沒有NeatImage,也未安裝Portraiture,因此對這個教程就不覺得然了。spa
當我再次瀏覽此教程時,終於耐下心本身試驗了下, 雖然我仍是沒有安裝NeatImage和Portraiture,可是能夠直接用PS自帶的表面模糊來替代,雖然效果會有所不一樣,可是卻不影響算法的核心效果。事實再次證實一個真理:別人講一千遍好,不如本身都一次感覺深。插件
那麼這個教程的一個最關鍵的效果就是磨皮的同時保留了膚質,很相似於可牛影像的效果,而屢次的實踐證實,可牛軟件100%也是採用了相似的過程。調試
咱們把那個教程的簡單操做步驟列表以下:code
一、複製一個圖層,咱們定義改層名字爲HighPasshtm
二、用插件對HighPass層磨皮;
三、應用圖像,模式選擇減去,縮放值爲1,誤差128;
四、更改HighPass層混合模式爲線性光,不透明度合適取值。
五、對HighPass層進行高斯模糊,模糊半徑0.5-2左右。
基本就這樣收工了,彷佛沒有什麼高深複雜的東西。
至於效果:咱們用幾幅實際的圖像來測試下(第二步用表面模糊來代替)。
原圖 去斑須要的紋理圖 結果圖(表面模糊參數半徑=10,閾值=16)
原圖 去斑須要的紋理圖 結果圖(表面模糊參數半徑=10,閾值=50)
爲了程序的實現,咱們對每一個步驟都進行對應的分析,爲方便,咱們假定原始圖像層爲Src層。
(1)複製圖層: 這個沒啥好說的,無非是分配一個一樣大小的內存,而後memcpy 函數複製 Src到HighPass層。
HighPass= Copy(Src);
(2)對HighPass層磨皮:這個算法能夠選擇:表面模糊、導向濾波、雙邊濾波、各向異性擴散、BEEP、局部均方差、Domain transfer、 Adaptive Manifolds、 Local Laplacian Filters等任何具備保邊效果的EPF-Filter,這裏很少說。
表達式爲: HighPass = EPF-Filter(HighPass);
(3)應用圖像:這裏的界面看上去彷佛很複雜,那代碼是否是很複雜呢,其實代碼簡單的嚇人,就是下面的計算公式:
HihgPass = HighPass - Src + 128;
看上去這個公式是否是很熟悉,不錯,這個和高反差保留的算法是如出一轍的,只是Photoshop內嵌的高反差保留用的是高斯模糊,這裏用的是EPF濾波器而已。
(4) 從編程角度來講,要把上述過程的第四步和第五步調換順序,不然會獲得錯誤的結果,所以這裏第四步是:
HighPass = GuassBlur(HighPass, Radius);
其中Radius爲高斯模糊的半徑。
(5) 進行圖層混合: 線性光混合的計算公式也很簡單:
假定兩個相鄰圖層X和Y,X在下方,Y在上方,X與Y混合,則X是基色,Y是混合色,X與Y混合獲得的顏色是結果色Z,對於線性光混合模式,其計算公式爲:
Z = X + 2 * Y - 256; (原先覺得是 - 255,後用PS CS6驗證是 - 256)
不透明度的計算公式就更爲簡單,若是Opacity表示Y的不透明度,則合成公式爲:
Z = (X * (100- Opacity) + Y * Opacity ) / 100;
那麼兩個綜合在一塊兒的計算公式爲:
Z = (X * (100- Opacity) + (X + 2 * Y - 256)* Opacity ) / 100;
綜合上述五個步驟,最後的計算公式即爲:
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
總的來講,這個算法並無什麼特別複雜的地方,其關鍵的恢復皮膚質感的步驟是第四步的高斯模糊,這個模糊的半徑通常越大,質感越強,可是太大,磨皮效果就沒有了,所以,這裏須要把握合適的度,通常半徑在0.5-2之間比較合適。
至於爲何用了這個高斯模糊就能夠恢復圖像的質感,我其實也是有些想法的,不過目前還不成熟,暫時無論他,知道結果而無論原因有的時候也是一種幸福。
再來講說算法的參數問題吧,做爲如今APP上美顏必備的這個功能,每一個APP都但願給用戶呈現出更少的更傻瓜(智能)的參數,在本過程當中,好比第二步,必然有不少可選的參數配置:若是選用表面模糊,則須要肯定半徑及閾值;若是使用導向濾波,則通常也須要半徑參數。如何根據用戶UI中的參數(好比磨皮程度)來肯定對應的內部的參數,就須要針對每一個不一樣的濾波器來作屢次的調試和實驗,這個並沒有固定的法則可遵循。
再如第三步應用圖像中常數128,其實也不必定是個定值,若是把他調大,則處理後的圖像總體偏亮,調小則圖像偏暗。
第五步的圖層的不透明度參數也是一個道理,若是不透明度值越大,則圖片總體的斑點可能會偏多,偏小,那麼圖像又會過於模糊,也許取個50%是個不錯的選擇吧,或者本身根據處理的紋理圖的某個指標作個算法更好吧。
算法速度方面其實主要取決於第二步,也就是EPF濾波器,這個就是個各顯神通的好地方,很少言。
其次就是高斯模糊的計算,高斯模糊必然有浮點計算,這對於手機等其餘硬件,多是個硬傷。而若是用方框模糊或者線性模糊等代替,則存在一個問題就是模糊的最小幅度即半徑爲1時,紋理恢復的效果都有點過,特別是在個人程序中,高斯模糊的計算用了差很少佔了整個用時的1/3.
若是看下這個的流程,能夠認爲美圖裏的任何一個磨皮算法都只是進行了該流程的第二步就爲止了,若是他在加上後續的處理,也必定能有和可牛相似的效果。
最後鄙視下可牛和美圖程序的磨皮算法的速度吧(我指的是PC上程序的速度):
我用的基於局部均方差的磨皮方式外加銳化等過程的耗時針對上面第二幅所謂的美女平均耗時約 35ms(基於表面模糊),25ms(基於均方差);
而可牛或者美圖我估計感受了,至少要有1000ms左右。
那麼相似的PS教程好比這裏:http://www.psjia.com/photoshop/photops/2012/0106/3891.html 的一下幾個過程算法其實也很簡單,而且也有着至關不錯的效果,而若是從實現上考慮也就只要一下幾個過程:
Invert(Src, Dest); HighPass(Dest, Dest, 10); GuassBlur(Dest, Dest, 1); BlendImage(Src, Dest, Dest, BlendMode::Overlay, 255);
最後咱們來比較下可牛、美圖、本文的處理效果:
原圖 美圖秀秀的智能模糊 程度深
可牛的磨皮 力度5 本文的磨皮效果
能夠看出,本文的效果和可牛的很是接近,能夠說明可牛也採用的該算法。
附上一個按照所謂平湖法的流程的作的一個測試程序: 仿可牛磨皮特效.rar
****************************做者: laviewpbt 時間: 2015.8.6 聯繫QQ: 33184777 轉載請保留本行信息**********************