美颜实现原理
五官调整
五官调整包括如下效果
wuguan.jpg最常见的大眼瘦脸效果实现方法有很多,包括局部调整算法,图片变形算法和基于深度学习的妆容迁移算法
局部平移算法
瘦脸及眼睛放大的前提是需要检测到人脸,提取特征点后进行相应的图像变形处理得到最终效果
image.png
由拉伸中心向某一点拉伸,以上图为例,点位18和点位25向点位30收缩,可以达到瘦脸效果,点位21和点位23向点位57收缩可以达到瘦下巴的效果
vec2 stretchFun(vec2 textureCoord, vec2 originPosition, vec2 targetPosition, float delta) {
vec2 offset = vec2(0.0);
vec2 result = vec2(0.0);
vec2 direction = (targetPosition - originPosition) * delta;
float radius = distance(vec2(targetPosition.x, targetPosition.y / aspectRatio), vec2(originPosition.x, originPosition.y / aspectRatio));
float ratio = distance(vec2(textureCoord.x, textureCoord.y / aspectRatio), vec2(originPosition.x, originPosition.y / aspectRatio)) / radius;
ratio = 1.0 - ratio;
ratio = clamp(ratio, 0.0, 1.0);
offset = direction * ratio;
result = textureCoord - offset;
return result;
}
最终实现效果
image (1).png
局部缩放算法
眼睛.jpg眼睛放大的时候只有圆形区域内的图像才进行变形,越靠近圆形,变形越大,反之变形越小,这样保证不改变脸部的整体信息
image (2).png
假设当前点为(x,y),手动指定变形区域的中心点为C(cx,cy),变形区域半径为r,手动调整变形终点(从中心点到某个位置M)为M(mx,my),变形程度为strength,当前点对应变形后的目标位置为U。
1、只有圆形选区内的图像才进行变形
2、越靠近圆心,变形越大,越靠近边缘的变形越小,边界处无变形
3、圆外像素不发生偏移
vec2 warpPositionToUse(vec2 centerPostion, vec2 currentPosition,
float radiusEye, float scaleRatio, float aspectRatio) {
vec2 positionToUse = currentPosition;
vec2 currentPositionToUse = vec2(currentPosition.x,
currentPosition.y * aspectRatio + 0.5 - 0.5 * aspectRatio);
vec2 centerPostionToUse = vec2(centerPostion.x,
centerPostion.y * aspectRatio + 0.5 - 0.5 * aspectRatio);
float r = distance(currentPositionToUse, centerPostionToUse);
if (r < radiusEye) {
/// r 越大则 alpha 越接近于 1 (基本不变)
/// r 越小,则放大效果越明显(显示中心处的颜色)
float alpha = 1.0 - scaleRatio * pow(r / radiusEye - 1.0, 2.0);
positionToUse = centerPostion + alpha * (currentPosition - centerPostion);
}
return positionToUse;
}
最终效果
image (3).png
美肤效果
美白
美白方式一般分为两种,一种是不考虑皮肤区域,全图美白,一种是仅针对皮肤区域美白
美白算法有多种,总结来分为两种,LUT调色法和图层混合法
LUT法
通过类似PS软件中调节亮度,对比度,曲线,色彩平衡等方式生成LUT表,优点是使用颜色滤镜LUT速度快
图层混合法
通过使用PS中的图层混合模式达到美白效果,具体思想是:将原图中的皮肤区域像素与纯白色像素进行“柔光”图层混合,然后调节不透明度达到美白效果
磨皮
图像保边滤波算法
磨皮算法,实际上就是平滑皮肤区域,将人像皮肤区域中一些皱纹,斑点以及痘痘等平滑掉,让皮肤看起来更光滑。要达到这种效果,需要一种滤波器,他既能对平坦的皮肤区域进行一定的平滑,又能较好的保留边缘信息,这种滤波器就是保边滤波器
保边滤波器算法,包括双边滤波、表面模糊、导向滤波等
肤色检测
待补充。。。
image (4).png磨皮算法
磨皮算法划分了多种算法:
● 通用磨皮算法
● 通道磨皮算法
● 高反差磨皮算法
● 细节叠加算法
● 其他算法
通用磨皮算法
- 输入原图S
- 对S进行肤色检测得到Mask
- 对Mask进行高斯滤波得到平滑的Mask A
- 对S进行保边滤波得到T,T是丢失了部分细节的平滑图像
- 计算效果图,D = S x (1 - A) + T x A
细节叠加磨皮算法
- 对原图S进行较大半径的保边滤波,得到滤波图A
- 对原图S进行较小半径的保边滤波,得到滤波图B
- 对B进行肤色检测得到肤色Mask图C
- 根据原图和图A得到细节,E = S - A
- 根据图B和图A技术细节,F = A - B
- 根据可调程度R, 细节控制参数K技术磨皮效果
K0 = C x R
D = A + K0 x F + (1 - K0 x K) x E
最终实现效果
image.png
image.png
image.png