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

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

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

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

图像局部缩放算法

待续。。。

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

 precision highp float;varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;uniform highp float scaleRatio;// 缩放系数,0无缩放,大于0则放大uniform highp float radius;// 缩放算法的作用域半径uniform highp vec2 leftEyeCenterPosition; // 左眼控制点,越远变形越小uniform highp vec2 rightEyeCenterPosition; // 右眼控制点uniform float aspectRatio; // 所处理图像的宽高比highp vec2 warpPositionToUse(vec2 centerPostion, vec2 currentPosition, float radius, 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 < radius){float alpha = 1.0 - scaleRatio * pow(r / radius - 1.0, 2.0);positionToUse = centerPostion + alpha * (currentPosition - centerPostion);}return positionToUse; }void main(){vec2 positionToUse = warpPositionToUse(leftEyeCenterPosition, textureCoordinate, radius, scaleRatio, aspectRatio);positionToUse = warpPositionToUse(rightEyeCenterPosition, positionToUse, radius, scaleRatio, aspectRatio);gl_FragColor = texture2D(inputImageTexture, positionToUse);   }

给个测试效果图:

 

图像局部平移算法

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

 precision highp float;varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;uniform highp float radius;uniform highp float aspectRatio;uniform float leftContourPoints[MAX_CONTOUR_POINT_COUNT*2];uniform float rightContourPoints[MAX_CONTOUR_POINT_COUNT*2];uniform float deltaArray[MAX_CONTOUR_POINT_COUNT];uniform int arraySize;highp vec2 warpPositionToUse(vec2 currentPoint, vec2 contourPointA,  vec2 contourPointB, float radius, float delta, float aspectRatio){vec2 positionToUse = currentPoint;vec2 currentPointToUse = vec2(currentPoint.x, currentPoint.y * aspectRatio + 0.5 - 0.5 * aspectRatio);vec2 contourPointAToUse = vec2(contourPointA.x, contourPointA.y * aspectRatio + 0.5 - 0.5 * aspectRatio);float r = distance(currentPointToUse, contourPointAToUse);if(r < radius){vec2 dir = normalize(contourPointB - contourPointA);float dist = radius * radius - r * r;float alpha = dist / (dist + (r-delta) * (r-delta));alpha = alpha * alpha;positionToUse = positionToUse - alpha * delta * dir;}return positionToUse;}void main(){vec2 positionToUse = textureCoordinate;for(int i = 0; i < arraySize; i++){positionToUse = warpPositionToUse(positionToUse, vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);positionToUse = warpPositionToUse(positionToUse, vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);}gl_FragColor = texture2D(inputImageTexture, positionToUse);}

同样给个测试效果:

 


Taily老段的微信公众号,欢迎交流学习

https://blog.csdn.net/taily_duan/article/details/81214815


【Android】自动瘦脸与眼睛放大美颜算法相关推荐

  1. 自动瘦脸与眼睛放大美颜算法[转载]

    自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping. 图像局部扭曲算法有三个:局部缩放(Local ...

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

    http://www.shenyanhao.com/2015/09/眼睛放大美颜算法/ 转载于:https://www.cnblogs.com/guochen/p/8573021.html

  3. OpenGL Shader 自动瘦脸与眼睛放大

    图像局部扭曲算法有三个:局部缩放(Local Scaling)算法.局部平移(Local Transition)算法和局部旋转(Local Rotation)算法.其中应用局部缩放算法可实现眼睛放大, ...

  4. 谈谈自动瘦脸和自动眼睛放大算法

    原地址:http://blog.csdn.net/celerychen2009/article/details/8839099 目前,手机上各种图片特效的软件应用App盛行,典型的如camare360 ...

  5. 图像美容之眼睛放大算法

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/3847357.html   ...

  6. 图像美容之眼睛放大算法。

    目前,手机上各种图像特效的软件应用App越来越盛行,比较有名如美图秀秀,camare360,美颜相机等,还有一些在某些特定的方向做的比较的优秀的如魔漫相机等.这些软件几乎无一例外的都提供了相当数量的针 ...

  7. python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法

    先上效果图: AI美颜 人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代. .... 每次写技术blog都要写一堆废话引 ...

  8. 均值滤波计算_从零学美颜算法保边滤波

    作者:天儿哥 有了前面的照片处理基础,这一篇开始讲美颜算法. 一.滤波为什么要保边? 人像美颜技术中,最重要的技术之一就是磨皮,没有磨皮谁还敢自拍,谁还敢直播? 磨皮本质上就是对图像进行滤波,比如前面 ...

  9. 图像滤镜艺术---最新美颜算法研究

    本文所讲的美颜算法主要指磨皮+美白+肤色+清晰度: 磨皮算法主要有两大类:①基于高反差保留的磨皮算法:②基于保边滤波器的磨皮算法: 对于高反差保留磨皮算法,具体过程如:点击打开链接 对于保边滤波器磨皮 ...

最新文章

  1. Python:列表前加*的作用
  2. 20 年前毁誉参半的网游《传奇》,背后是怎样的故事?
  3. lisp天正图元位置修改_块内图元的坐标定位[已解决]感谢版主
  4. spring boot实战(第十篇)Spring boot Bean加载源码分析
  5. SLAM: SLAM的发展历程(WIKI)
  6. POJ - 3734 Blocks 指数生成函数
  7. 《App后台开发运维与架构实践》第2章 App后台基础技术
  8. 中国自主可控的全数字实时仿真软件SkyEye支持龙芯CPU指令级仿真
  9. 洛谷P1482 Cantor表(升级版) 题解
  10. 智能优化算法:风驱动优化算法-附代码
  11. 目标检测的图像特征提取之(二)LBP特征
  12. 实现关联条件的casewhen效果
  13. 实力验证:金蝶EAS 8.2授权注册 (包含Apusic 9999连接数破解)
  14. Spring Security Oauth2 JWT、第三方登录、单点登录讲解,并使用Oauth2.0结合微服务进行单点登录
  15. Oracle SQL基础
  16. 紫川歪传------------恶搞暴笑版
  17. itpt_TCPL 第五章:指针和数组 - 第八章:UNIX系统接口
  18. 计算机853调剂,北京科技大学853电路分析基础考研大纲
  19. 数据项组成数据元素,数据元素组成数据
  20. ARM体系架构—ARMv7-A指令集:内存操作指令

热门文章

  1. html5 圆圈扩散,CSS3地图动态实例代码(圆圈向外扩散)
  2. Java基础:说说Java
  3. [转]如何解决Windows图片预览窗口无法显示图片缩略图
  4. AWVS安装(未来即将到来)
  5. iOS开发--音频播放、录音、视频播放、拍照、视频录制
  6. 一般纳税人企业如何合理避税?
  7. 图文识别Readiris Pro 17
  8. 用python来实现输出 1-1000的素数,并且按照每8个一行输出
  9. kengoro机器人哪儿有卖_日本东京大学创造出“骨格精奇”的机器人Kengoro 会流汗能做掌上压...
  10. 工业相机的曝光方式:全局曝光、卷帘曝光、全局复位释放曝光区别