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

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

人脸检测可以使用OpenCV自带的人脸检测器,人脸对齐可以使用Face Alignment at3000 FPS via Regressing Local Binary Features中的算法,实现参见https://github.com/yulequan/face-alignment-in-3000fps
图像局部缩放算法 
至于图像局部缩放算法实现,文献中有伪码描述,这里我给出一个简单的OpenGL Shader可以用于实现眼睛放大(其实也可以缩小)。

 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); }

转载于:https://www.cnblogs.com/mvision/p/7986339.html

自动瘦脸与眼睛放大美颜算法[转载]相关推荐

  1. 【Android】自动瘦脸与眼睛放大美颜算法

    自动瘦脸与眼睛放大美颜算法 自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping.这篇论文详细描述了算 ...

  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. python 非线性规划_自动驾驶运动规划-Hybird A*算法(续)

    Hybird A*算法保证生成的路径是车辆可实际行驶的,但它仍然包含很多不必要的车辆转向操作,我们可以对其进行进一步的平滑和优化. Objective Function 对于Hybird A*生成的车 ...

  9. SQL Server 自动更新统计信息的基本算法

    最初接触SQL Server的时候认为SQLServer数据更改的同时就会相应的更新统计信息,其实SQL Server不是这样做的.基于性能考虑,SQL Server使用下面的算法更新统计信息. 自动 ...

最新文章

  1. 这款开源测试神器,圆了我玩游戏不用动手的梦想
  2. JavaWeb 使用nginx负载均衡
  3. CentOS系统双网卡路由设置
  4. python与 积分
  5. 删除下拉框只找23火星软件_用Rhino秀个火星榨汁机?
  6. 【优化求解】基于matlab模拟退火算法求解函数极值问题【含Matlab源码 1203期】
  7. [转载]静息态fMRI、DTI、VBM
  8. Hook技术第二讲,之虚表HOOK
  9. 集群通信组件Tribes之整体介绍
  10. 汽车维修企业管理【10】
  11. STM32CubeMX | | 使用小熊派玩转颜色识别传感器(纯手工打造E53传感器模块)
  12. Reducing Language Biases in Visual Question Answering with Visually-Grounded Question Encoder 论文笔记
  13. Android开发之智能聊天机器人
  14. vue运行(Emitted value instead of an instance of Error)
  15. Android Button英文全部大写问题
  16. Apollo beta公测版本安装
  17. Fiddler抓包6-打断点(bpu)
  18. 将钉钉应用内浮窗_DingTalk,钉消息
  19. 高中数学必修3知识点总结归纳:第一章算法初步
  20. 小型商城全新简洁风格全新UI H5移动端购物商城系统源码

热门文章

  1. 捕获OutputDebugString
  2. Rainbow Crack在windows生成彩虹表并破解Hash值
  3. 阿强《HI-FI最强音》[DTS-WAV分轨/百度云]
  4. 鼠标坏了,鼠标单击变双击怎么办?微动开关怎么拆?
  5. python与数据挖掘课后实验答案_中国大学数据挖掘与python实践课后习题答案
  6. MFC中的文件对话框类CFileDialog详解
  7. java Condition类的详细介绍
  8. buu 水题记录(一)
  9. Sqlserver 双机热备份_从数据库发布(主从备份)
  10. 【微信小程序】云开发(Cloud Base)环境配置以及编写第一个云函数