自动瘦脸与眼睛放大美颜算法

news/2024/10/26 14:30:55/

自动瘦脸与眼睛放大美颜算法


自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping。这篇论文详细描述了算法原理,并提供了伪码实现,有兴趣的同学自行下载研读。

图像局部扭曲算法有三个:局部缩放(Local Scaling)算法、局部平移(Local Transition)算法和局部旋转(Local Rotation)算法。其中应用局部缩放算法可实现眼睛放大,局部平移算法则可用于实现瘦脸效果。当然,图像局部缩放算法只是眼睛放大算法流程中的最关键的一步,要实现自动眼睛放大算法还需要额外的步骤。简单来说,给一张美女头像,你首先需要应用自动人脸检测技术定位出图像中的眼睛位置;然后基于此位置坐标应用图像局部缩放算法。自动瘦脸算法流程类似,不同之处在于应用人脸检测技术得到人脸轮廓点,由这些轮廓坐标点应用局部平移算法得到瘦脸效果。

人脸检测现在已经是一个很成熟的技术,网上也有很多开放资源,目前我只是算法验证,暂时使用的是face++提供的人脸关键点检测SDK。它可以得到很丰富的人脸特征点,包括眉毛、眼睛、鼻子、嘴巴以及脸部轮廓的各个参数,企业应用可能需要付费授权才能使用,个人验证只要注册获取key就能简单集成。

图像局部缩放算法

待续。。。

至于图像局部缩放算法实现,文献中有伪码描述,这里我给出一个简单的OpenGL Shader可以用于实现眼睛放大(其实也可以缩小),偷懒的同学自取,有问题可以跟我讨论,但我不对此代码导致的bug负责。

[cpp]  view plain copy
  1. precision highp float;  
  2.   
  3. varying highp vec2 textureCoordinate;  
  4. uniform sampler2D inputImageTexture;  
  5.   
  6. uniform highp float scaleRatio;// 缩放系数,0无缩放,大于0则放大  
  7. uniform highp float radius;// 缩放算法的作用域半径  
  8. uniform highp vec2 leftEyeCenterPosition; // 左眼控制点,越远变形越小  
  9. uniform highp vec2 rightEyeCenterPosition; // 右眼控制点  
  10. uniform float aspectRatio; // 所处理图像的宽高比  
  11.   
  12. highp vec2 warpPositionToUse(vec2 centerPostion, vec2 currentPosition, float radius, float scaleRatio, float aspectRatio)  
  13. {  
  14.     vec2 positionToUse = currentPosition;  
  15.       
  16.     vec2 currentPositionToUse = vec2(currentPosition.x, currentPosition.y * aspectRatio + 0.5 - 0.5 * aspectRatio);  
  17.     vec2 centerPostionToUse = vec2(centerPostion.x, centerPostion.y * aspectRatio + 0.5 - 0.5 * aspectRatio);  
  18.       
  19.     float r = distance(currentPositionToUse, centerPostionToUse);  
  20.       
  21.     if(r < radius)  
  22.     {  
  23.         float alpha = 1.0 - scaleRatio * pow(r / radius - 1.0, 2.0);  
  24.         positionToUse = centerPostion + alpha * (currentPosition - centerPostion);  
  25.     }  
  26.        
  27.     return positionToUse;   
  28. }  
  29.   
  30. void main()  
  31. {  
  32.     vec2 positionToUse = warpPositionToUse(leftEyeCenterPosition, textureCoordinate, radius, scaleRatio, aspectRatio);  
  33.        
  34.     positionToUse = warpPositionToUse(rightEyeCenterPosition, positionToUse, radius, scaleRatio, aspectRatio);  
  35.     
  36.     gl_FragColor = texture2D(inputImageTexture, positionToUse);     
  37. }  


给个测试效果图:

bigeye-src bigeye-dst

图像局部平移算法

图像局部平移算法还是参见论文,多说无益,在此奉上对应Shader代码给需要的同学,可以实现瘦脸和肥脸。这里需要指定瘦脸的控制点,最多支持MAX_CONTOUR_POINT_COUNT个控制点。

[cpp]  view plain copy
  1. precision highp float;  
  2.   
  3. varying highp vec2 textureCoordinate;  
  4. uniform sampler2D inputImageTexture;  
  5.   
  6. uniform highp float radius;  
  7.   
  8. uniform highp float aspectRatio;  
  9.   
  10. uniform float leftContourPoints[MAX_CONTOUR_POINT_COUNT*2];  
  11. uniform float rightContourPoints[MAX_CONTOUR_POINT_COUNT*2];  
  12. uniform float deltaArray[MAX_CONTOUR_POINT_COUNT];  
  13. uniform int arraySize;  
  14.   
  15. highp vec2 warpPositionToUse(vec2 currentPoint, vec2 contourPointA,  vec2 contourPointB, float radius, float delta, float aspectRatio)  
  16. {  
  17.     vec2 positionToUse = currentPoint;  
  18.       
  19.     vec2 currentPointToUse = vec2(currentPoint.x, currentPoint.y * aspectRatio + 0.5 - 0.5 * aspectRatio);  
  20.     vec2 contourPointAToUse = vec2(contourPointA.x, contourPointA.y * aspectRatio + 0.5 - 0.5 * aspectRatio);  
  21.       
  22.     float r = distance(currentPointToUse, contourPointAToUse);  
  23.     if(r < radius)  
  24.     {  
  25.         vec2 dir = normalize(contourPointB - contourPointA);  
  26.         float dist = radius * radius - r * r;  
  27.         float alpha = dist / (dist + (r-delta) * (r-delta));  
  28.         alpha = alpha * alpha;  
  29.           
  30.         positionToUse = positionToUse - alpha * delta * dir;  
  31.           
  32.     }  
  33.       
  34.     return positionToUse;  
  35.       
  36. }  
  37.   
  38.   
  39. void main()  
  40. {  
  41.     vec2 positionToUse = textureCoordinate;  
  42.       
  43.     for(int i = 0; i < arraySize; i++)  
  44.     {  
  45.        
  46.         positionToUse = warpPositionToUse(positionToUse, vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);  
  47.         positionToUse = warpPositionToUse(positionToUse, vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);  
  48.     }  
  49.       
  50.     gl_FragColor = texture2D(inputImageTexture, positionToUse);  
  51.       
  52. }  


同样给个测试效果:

smallface-src smallface-dst

 

本条目发布于 2015年9月23日 。属于 人像美颜技术 分类。

http://www.ppmy.cn/news/289487.html

相关文章

计算机操作人员眼睛离屏幕多远,最新中小学生安全知识竞赛问答

最新中小学生安全知识竞赛问答 66、什么是“三同时”制度? 答&#xff1a;指新建、改建、扩建工程以及技术改造、挖潜和引进工程项目的劳动保护设施必须与主体工程同时设计、同时施工、同时投入生产与使用的原则。 67、为什么在清洗电动机械设备时必须关闭电源? 答&#xff1…

眼睛护理

眼周要分区护理。下眼睑最容易滋生干水纹&#xff0c;熟龄纹等恼人的细纹了呢。但只给下眼周肌肤补充营养&#xff0c;却忽略了上眼皮&#xff0c;这可不是高明的护眼策略哦。正确的涂抹眼霜 的方法就是下眼周肌肤要注重滋润&#xff0c;上眼周肌肤要注重紧致哦&#xff0c;用质…

pyhton使用opencv在头像中查找眼睛

python是AI使用最多的语言&#xff0c;加入opencv&#xff0c;更是如虎添翼&#xff0c;以下就是在头像中查找眼睛&#xff0c;准备一张眼睛的图片和一张头像的图片&#xff0c;就可以在这个头像中找到眼睛。 由于这只是演示&#xff0c;眼睛可以不是这个头像中的&#xff0c;…

Linux最多支持的磁盘数目

作者&#xff1a;康华, 华清远见嵌入式学院 上海中心讲师。 想这个标题我想了很久&#xff1f;想了如下几个标题&#xff0c;A&#xff1a;Linux最多支持的SCSI LUN是多少个&#xff1f;B&#xff1a;Linux最多支持的SAN存储盘的个数是多少&#xff1f; 实际情况&#xff1a;事…

mc服务器修改生物上限,MC修改最多的生物,无论是什么样子,我们都喜欢

我的世界:猪灵的进化史,万圣节上发出这么惊悚的生物,不血腥吗 MC修改最多的生物,无论是什么样子,我们都喜欢 大家知道吗,我们不算上Minecraft模组中的生物,只算官方目前截止发布的生物就超过80种的,在MC中我们可以看见的任何的一种生物都是官方的深思熟虑和玩家们共同商…

就很突然?程序员的发量不是秃头最多的?

太秃然了&#xff01;这两天&#xff0c;一条如何看待大厂裁员影响植发业的话题在微博引发讨论。 对于此话题&#xff0c;更多网友表示无奈又哭笑不得。“秃顶”、“植发”似乎成了程序员的标签。 那么互联网人掉头发真的很严重吗&#xff1f;大家常说的“变秃了也变强了”的程…

《我的眼睛--图灵识别》第十二章:实战演练:图形类识别

《我的眼睛–图灵识别》第十二章&#xff1a;实战演练&#xff1a;图形类识别 1、箭头朝向 更有部分的网络游戏也是非常的调皮&#xff0c;它们即不用数字和字母的组合&#xff0c;也不用找图案的方式&#xff0c;而是给出了4个方向的答案选择&#xff0c;问你一个图形的箭头…

一台主机最多能创建多少个 TCP 连接?

这是「进击的Coder」的第 400 篇技术分享 作者&#xff1a;闪客sun 来源&#xff1a;低并发编程 “ 阅读本文大概需要 13 分钟。 ”‍ 低并发编程 战略上藐视技术&#xff0c;战术上重视技术 本文坚持看到结尾才有动图 气不气&#xff1f; 我是一个 Linux 服务器上的进程&…