1. 簡介
這學期的計算機視覺課,我們組的課程項目為“照片自動美化”,其中我負責的模塊為人臉檢測與自動磨皮。
功能為:用戶上傳一張照片,自動檢測並定位出照片中的人臉,將照片中所有的人臉進行“磨皮”處理,使照片得到自動美化。
完整代碼見於GitHub。
2. 重要步驟
人臉檢測
OpenCV樣例庫中自帶的訓練結果采用的是Viola-Jones框架,選擇了一種類Haar矩形特征,采用Ada-Boost這種自適應上升的算法來選擇用於分類的特征並進行分類,最后使用弱分類器級聯的架構來實現快速運算。
人臉檢測使用了OpenCV自帶的訓練結果,且在OpenCV自帶的樣例庫程序facedetect.cpp
的基礎上修改而成,故不再放上此部分代碼。
計划夏季學期中參考Kaggle上的人臉五官檢測項目,換成卷積神經網絡重新訓練人臉檢測模型,到時再更新此部分代碼。
磨皮算法
嘗試了多種濾波器之后,選用了PS教程《簡單探討可牛影像軟件中具有膚質保留功能的磨皮算法及其實現細節》中介紹的算法:
- 對原圖層
image
進行雙邊濾波,結果存入temp1
圖層中。 - 將
temp1
圖層減去原圖層image
,將結果存入temp2
圖層中。 - 對
temp2
圖層進行高斯濾波,結果存入temp3
圖層中。 - 以原圖層
image
為基色,以temp3
圖層為混合色,將兩個圖層進行線性光混合得到圖層temp4
。 - 考慮不透明度,修正上一步的結果,得到最終圖像
dst
。
若用Opacity表示圖層4的不透明度,則5個步驟的綜合公式為:dst = (image * (100 - Opacity) + (image + 2 * GaussianBlur (bilateralFilter (image) - image + 128) - 256) * Opacity) /100 ;
將該算法用OpenCV實現的代碼如下:
1 Mat dst; 2 3 int value1 = 3, value2 = 1; //磨皮程度與細節程度的確定 4 5 int dx = value1 * 5; //雙邊濾波參數之一 6 double fc = value1*12.5; //雙邊濾波參數之一 7 int p = 50; //透明度 8 Mat temp1, temp2, temp3, temp4; 9 10 //雙邊濾波 11 bilateralFilter(image, temp1, dx, fc, fc); 12 13 temp2 = (temp1 - image + 128); 14 15 //高斯模糊 16 GaussianBlur(temp2, temp3, Size(2 * value2 - 1, 2 * value2 - 1), 0, 0); 17 18 temp4 = image + 2 * temp3 - 255; 19 20 dst = (image*(100 - p) + temp4*p) / 100; 21 dst.copyTo(image);
細節上的難點處理
- 獲取識別結果:OpenCV人臉識別樣例中給出的識別結果為圓心和半徑,將其轉換成矩形區域便於定義興趣區域進行濾波。
- 矯正定位結果:為了實現不同長短人臉的完全覆蓋,將矩形長度擴大至原來的1.3倍。
- 魯棒性檢查:
- 若上一步矯正后矩形區域超過圖片尺寸,則以圖片尺寸為上下邊界。
- 若出現人臉不完整識別失敗的情況,則對整張圖片進行磨皮操作。
- 確定磨皮程度和細節程度參數:經過反復試驗,將磨皮程度
value1
:細節程度value2
確定為3:1,並以此確定雙邊濾波的兩個參數dx
和fc
。
4. 結果分析
- 使用了Viola-Jones檢測框架,能夠實現較高的檢測精度,使檢測率和誤檢率分別保持在較高和較低的水平。
- 磨皮算法效果較好,能夠較好地掩蓋人臉上的瑕疵,而且較大限度地保留細節、邊緣與質感。
- 在對人臉進行定位時,由於不同的人臉長短不同,Viola-Jones檢測框架定位得到的結果不是很准確,導致某張人臉不能完全包括,或另一張人臉包括范圍太大。在處理時采取了盡量選擇較大范圍的原則,在計算人臉矩形的長度時統一將半徑擴大至了1.3倍,這樣定位出的人臉區域不是很精確。
- 下一步考慮使用基於HSV色彩空間的人臉分割方法,將人臉准確定位在一個非矩形的區域里,以得到更好的磨皮效果,避免“少磨”或“多磨”了部分區域。
===============================================================================================
-----------------------------------------
opencv實現photoshop 算法:http://download.csdn.net/user/c80486/uploads