这学期的计算机视觉课,我们组的课程项目为“照片自动美化”,其中我负责的模块为人脸检测与自动磨皮。
功能为:用户上传一张照片,自动检测并定位出照片中的人脸,将照片中所有的人脸进行“磨皮”处理,使照片得到自动美化。
完整代码见于GitHub。
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);
value1
:细节程度value2
确定为3:1,并以此确定双边滤波的两个参数dx
和fc
。===============================================================================================
-----------------------------------------
opencv实现photoshop 算法:http://download.csdn.net/user/c80486/uploads
原文:http://www.cnblogs.com/wainiwann/p/6475653.html