談可牛影像磨皮演算法及其於美圖秀秀之類軟體磨皮的區別和聯絡。

來源:互聯網
上載者:User

標籤:

      在幾年前寫的一篇關於BEEP的文章時,我曾經說過Beep的去噪作用可以用於磨皮,並且給出了結論BEEP比可牛和美圖等的效果要更為好,現在看來,那個結論確實是太為誇張和固定了。不同的人的審美觀不同,同一個人在不同時段審美觀也會有所差異,現在看來,我到時覺得可牛影像的帶有膚質保留效果的磨皮更加自然,也更加符合實際的情況。

      在前段日子裡,又隨意的百度了下PS的磨皮教程,看到了很多的曾經看過的例子,也看到了一些當時不以為然的文章。其中就包括http://www.missyuan.com/thread-468975-1-1.html這裡講的流程,因為看到其第二步為:

     2、用外掛程式磨皮

        這一步很重要,直接影響最終效果,磨光一些,不要擔心紋理。

        平湖老師可能用的NeatImage,我這裡使用的是Portraiture, 把紅框內的滑塊都拉到最大。

      當時自己沒有NeatImage,也未安裝Portraiture,所以對這個教程就不以為然了。

      當我再次瀏覽此教程時,終於耐下心自己實驗了下, 雖然我還是沒有安裝NeatImage和Portraiture,但是可以直接用PS內建的表面模糊來替代,雖然效果會有所不同,但是卻不影響演算法的核心效果。事實再次證明一個真理:別人講一千遍好,不如自己都一次感受深。

      那麼這個教程的一個最關鍵的效果就是磨皮的同時保留了膚質,很類似於可牛影像的效果,而多次的實踐證明,可牛軟體100%也是採用了類似的過程。

      我們把那個教程的簡單操作步驟列表如下:

  1、複製一個圖層,我們定義改層名字為HighPass

     2、用外掛程式對HighPass層磨皮;

     3、應用映像,模式選擇減去,縮放值為1,偏差128;

     4、更改HighPass層混合模式為線性光,不透明度合適取值。

     5、對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;

     總的來說,這個演算法並沒有什麼特別複雜的地方,其關鍵的恢複皮膚質感的步驟是第四步的高斯模糊,這個模糊的半徑一般越大,質感越強,但是太大,磨皮效果就沒有了,因此,這裡需要把握合適的度,一般半徑在0.5-2之間比較合適。

     至於為什麼用了這個高斯模糊就可以恢複映像的質感,我其實也是有些想法的,不過目前還不成熟,暫時不管他,知道結果而不管緣由有的時候也是一種幸福。 

     再來說說演算法的參數問題吧,作為現在APP上美顏必備的這個功能,每個APP都希望給使用者呈現出更少的更傻瓜(智能)的參數,在本過程中,比如第二步,必然有很多可選的參數配置:如果選用表面模糊,則需要確定半徑及閾值;如果使用導向濾波,則一般也需要半徑參數。如何根據使用者UI中的參數(比如磨皮程度)來確定對應的內部的參數,就需要針對每個不同的濾波器來做多次的調試和實驗,這個並無固定的法則可遵循。 

      再如第三步應用映像中常數128,其實也不一定是個定值,如果把他調大,則處理後的映像整體偏亮,調小則映像偏暗。

      第五步的圖層的不透明度參數也是一個道理,如果不透明度值越大,則圖片整體的斑點可能會偏多,偏小,那麼映像又會過於模糊,也許取個50%是個不錯的選擇吧,或者自己根據處理的紋理圖的某個指標做個演算法更好吧。

      演算法速度方面其實主要取決於第二步,也就是EPF濾波器,這個就是個各顯神通的好地方,不多言。

      如果看下這個的流程,可以認為美圖裡的任何一個磨皮演算法都只是進行了該流程的第二步就為止了,如果他在加上後續的處理,也一定能有和可牛類似的效果。

      

      最後在鄙視下可牛和美圖程式的磨皮演算法的速度吧(我指的是PC上程式的速度):

            我用的基於局部均方差的磨皮方式外加銳利化等過程的耗時針對上面第二幅所謂的美女平均耗時約 35ms(基於表面模糊),25ms(基於均方差);

            而可牛或者美圖我估計感覺了,至少要有1000ms左右。

  附上我做的一個測試程式:   仿可牛磨皮特效.rar

 

 

**************************** laviewpbt   時間: 2015.8.6    聯絡QQ:  33184777 轉載請保留本行資訊**********************

 

 

談可牛影像磨皮演算法及其於美圖秀秀之類軟體磨皮的區別和聯絡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.