现在很多图像美颜app,处理后不但使人物皮肤变得平滑、白皙,还会稍微瘦下脸、放大眼睛,给人眼前一亮的感觉。这其中涉及人脸检测及特征点提取算法,一般提取68个特征点就足够了,同时也涉及图像局部变形算法。这也是两个研究方向,前者主要是计算机视觉,后者是图像处理。但随着深度学习的大热及在多个领域的成功应用,很多图像处理技术也开始采用深度学习算法实现突破,比如基于深度学习的降噪、超分辨率、非真实感绘制等等技术。深度学习大有在计算机视觉、图像处理一统之态势。言归正传,本文主要还是介绍瘦脸及放大眼睛所用到的图像局部变形算法。主要参考:交互式图像变形算法一文 。看过该文章后,自然了解瘦脸其实用的是图像局部平移变形,放大眼睛,用的是图像局部缩放变形。同时,文章还阐述了图像局部旋转变形的算法原理及思路。
       瘦脸及放大眼睛的前提是需要检测到人脸,并提取特征点。谈到图像变形,最基础的思路是:由变形前坐标,根据变形映射关系,得到变形后坐标。这其中变形映射关系是最关键的,不同的映射关系,将得到不同的变形效果。平移、缩放、旋转,对应的是不同的映射关系,即不同的变换公式。当然实际在计算过程中,用的是逆变换,即由变形后坐标,根据逆变换公式反算变形前坐标,然后插值得到该坐标rgb像素值,将该rgb值作为变形后坐标对应的像素值。这样才能保证变形后的图像是连续、完整的。
       下面简单讲一下图像局部平移变形,该变形稍微复杂一些,公式如下:

公式中,由于主要是像素点位置计算,因此涉及一些矢量运算,不过比较简单。其实上面公式就是逆变换公式了,x是变换后的位置,u是原坐标位置。整个计算在以c为圆心,r为半径的圆内进行。因为是交互式图像局部变形,所以c也可以看做鼠标点下时的坐标,而m为鼠标移动一段距离后抬起时的坐标,这样c和m就决定了变形方向。下面是示例代码,公式结合代码一起看,应该很快能弄明白。
void LocalTranslationWarp(Mat &img, int warpX, int warpY, int warpW, int warpH, int directionX, int directionY, double warpCoef)
{
    RestrictBounds(warpX, warpY, warpW, warpH);
 
    Mat imgCopy;
    copyMakeBorder(img, imgCopy, 0, 1, 0, 1, BORDER_REPLICATE);
 
    Point center(warpX + (warpW>>1), warpY + (warpH>>1));
    double radius = (warpW < warpH) ? (warpW >> 1) : (warpH >> 1);
    radius = radius * radius;
 
    // 平移方向矢量/模
    double transVecX = directionX - center.x;
    double transVecY = directionY - center.y;
    double transVecModel = transVecX*transVecX + transVecY*transVecY;
 
    // 水平/垂直增量//映射后位置与原位置
    double dx = 0, dy = 0, posX = 0.0, posY = 0.0, posU = 0.0, posV = 0.0;
    // 点到圆心距离/平移比例
    double distance = 0.0, ratio = 0.0;
    // 插值位置
    int startU = 0, startV = 0;
    double alpha = 0.0, beta = 0.0;
 
    int maxRow = warpY + warpH;
    int maxCol = warpX + warpW;
    uchar* pImg = NULL;
    for (int i = warpY; i < maxRow; i++)
    {
        pImg = img.data + img.step * i;
        for (int j = warpX; j < maxCol; j++)
        {
            posX = j;
            posY = i;
            dx = posX - center.x;
            dy = posY - center.y;
            distance = dx*dx + dy*dy;
            if (distance < radius)
            {
                ratio = (radius - distance) / (radius - distance + transVecModel * warpCoef);
                posU = posX - ratio * ratio * transVecX;
                posV = posY - ratio * ratio * transVecY;
 
                startU = (int)posU;
                startV = (int)posV;
                alpha = posU - startU;
                beta  = posV - startV;
                BilinearInter(imgCopy, startU, startV, alpha, beta, pImg[3*j], pImg[3*j + 1], pImg[3*j + 2]);
            }
        }
    }
}
       可以看到,只有圆形选区内的图像才进行变形。越靠近圆心,变形越大,反之变形越小。对于图像缩放变形及旋转变形,公式比较简单,实现起来也容易一些,本文就不在详细讲解了。应用上面算法,简单的瘦脸效果如下:
    
       
       参考文献:
       http://www.gson.org/thesis/warping-thesis.pdf
       http://www.cnblogs.com/xiaotie/archive/2009/12/08/1619046.html
--------------------- 
作者:grafx 
来源:CSDN 
原文:https://blog.csdn.net/grafx/article/details/70232797 
版权声明:本文为博主原创文章,转载请附上博文链接!

图像处理算法之瘦脸及放大眼睛相关推荐

  1. php 美颜,图像处理美颜算法之瘦脸及放大眼睛

    现在很多图像美颜app,处理后不但使人物皮肤变得平滑.白皙,还会稍微瘦下脸.放大眼睛,给人眼前一亮的感觉.这其中涉及人脸检测及特征点提取算法,一般提取68个特征点就足够了,同时也涉及图像局部变形算法. ...

  2. 图像变形算法之meitu瘦脸及放大眼睛(文末含代码)

    导语:很多时候,我们需要对一个图像的局部进行调整,这个调整必须是平滑的和可交互式的.Photoshop液化滤镜中向前变形工具就是这样一个工具,很好用.类似工具有美图秀秀(http://xiuxiu.m ...

  3. scriptol图像处理算法

    神奇的图像处理算法 相似图片搜索是利用数学算法,进行高难度图像处理的一个例子.事实上,图像处理的数学算法,已经发展到令人叹为观止的地步. Scriptol列出了几种神奇的图像处理算法,让我们一起来看一 ...

  4. 整理智能车中使用到的摄像头图像处理算法

    整理智能车中使用到的摄像头图像处理算法 19年的智能车竞赛给我留下了很深远的影响,不管是算法思路还是解决问题的方法对我来说都受益匪浅.今天整理资料时又翻出这些代码,回忆起做车时不分日夜地在赛道上调试, ...

  5. 1数字图像获取:1.3图像处理算法的形式

    图像处理算法就是利用数学原理与计算机程序对数字图像进行处理的基础.   局部处理的例子:对一幅图像采用3x3模板进行卷积运算,用3x3的模板在该图像上进行扫描式的平移,每一个像素的卷积计算值是由并仅由 ...

  6. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速

    基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...

  7. 水下图像处理算法Sea-thru

    水下图像处理算法Sea-thru,出自CVPR 2019,被称之为将彻底改变水下计算机视觉的"革命性工具". 代码开源 https://github.com/jgibson2/se ...

  8. 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础

    本次给大家带来的是有三AI-CV春季划组OpenCV与经典图像处理算法的直播回放,如果你还不知道有三AI-CV春季划是什么,可以看下面的视频和图文. 点击边框调出视频工具条 [CV春季划]言有三手把手 ...

  9. 图像处理算法工程师——1必备技能总结——2面试题大全

    图像算法工程师三重境界 : 一.传统图像算法工程师:  主要涉及图形处理,包括形态学.图像质量.相机成像之3A算法.去雾处理.颜色空间转换.滤镜等,主要在安防公司或者机器视觉领域,包括缺陷检测: 二. ...

最新文章

  1. 并发 IO多路复用 select 非asyncio
  2. 13 款惊艳的 Node.js 框架——第1部分
  3. Sqlserver 2012 导入 DBF文件
  4. php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  5. GDCM:gdcm::VM的测试程序
  6. Keras 获取中间某一层输出
  7. html5 php idea,五个HTML5新特性
  8. JSP自定义标签就是如此简单
  9. 随机过程第二章part2
  10. 哈佛引用格式(Harvard referencing system)
  11. axis2弱密码漏洞复现
  12. android 模拟menu键点击事件,android处理Back键Home键和Menu键事件(转)
  13. 2019.5.29 中移物联网前端实习生笔试
  14. 计算机视觉项目实战-图像特征检测harris、sift、特征匹配
  15. 计算机网络面试常见题
  16. 社会保障卡读取基本文件数据
  17. 网页游戏小游戏云开发的心得
  18. 计算机网络期末复习资料(一)
  19. Gradle排除依赖模块的某个类
  20. ms dtc 启动失败的解决办法。

热门文章

  1. java下列语句正确的是_下列Java语句中,不正确的一项是( )。
  2. 【c语言】蓝桥杯基础练习 闰年判断
  3. WiFi攻击的三种方式
  4. Tomcat的常用配置
  5. 网络IO模型的深入浅出
  6. 瞄准医疗数据安全四大风险 东软DBA如何绝地阻击
  7. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网...
  8. mysql_5.6.21_安装使用说明
  9. RamDisk - 充分利用Vista的大内存
  10. 笨办法学python3_笨办法学python3—练习38