face morhper
图像变形背后的想法很简单。给定两个图像
,
我们想
通过将图像
和混合来创建中间图像
。图像的混合
和
由参数控制的
是在0和1之间(
)。当
为0时,变形
看起来像
,而当
为1 时,变形看起来
像
。天真的,您可以在每个像素上使用以下方程式混合图像

但是,使用上面的方程式将希拉里·克林顿国务卿和特德·克鲁兹参议员的图像
设置为0.5,会产生以下可怕结果。

产生的图像令人不安,但同时也会给您尖叫。恳求您在融合图像之前以某种方式对齐眼睛和嘴巴。当您尝试在不先调整思路的情况下将两种不同的政治意识形态融合在一起时,就会得到类似的令人不安的结果,但我离题了。
因此,要将图像变形
为图像,
我们需要首先在两个图像之间建立像素对应。换句话说,对于
图像中的每个像素
,我们需要找到它
在图像中的对应像素
。假设我们神奇地找到了这些对应关系,我们可以分两步混合图像。首先,我们需要计算
变形图像中像素的位置。由下式给出
(1) 
其次,我们需要
使用以下公式找到像素的强度
(2) 
而已。我们完了。现在,我们去投票给特朗普。开玩笑!就像特朗普一样,我省略了一些重要的细节。为图像I中的每个像素找到图像J中的对应点与在美国和墨西哥之间建立10英尺的墙一样困难。可以做到,但是它很昂贵,并不是真正必要的。
但是很容易找到一些点对应关系。为了使两个不同的对象(如猫的脸和人的脸)变形,我们可以单击两个图像上的几个点以建立对应关系,并为其余像素插值结果。接下来,我们将详细了解“脸部变形”的完成方式,但是相同的技术可以应用于任何两个对象。
脸部变形:逐步
可以使用以下步骤变形两个面。为了简单起见,我们将假定图像的大小相同,但这不是必需的。
1.使用面部特征检测找到点对应

让我们从获取相应点开始。首先,我们可以通过检测面部特征点来自动(或手动)获得很多点。我使用dlib来检测68个对应点。接下来,我又增加了四个点(一个在右侧耳朵上,一个在脖子上,另外两个在肩膀上)。最后,我还添加了图像的角点和这些角点之间的中间点作为对应点。不用说,可以在头和脖子周围添加更多点以获得更好的结果,或者删除手动单击的点以获得稍微差一点(但是全自动的)的结果。
2. Delaunay三角剖分
从上一步开始,我们有两组80个点-每个图像一组。我们可以计算两组中对应点的平均值,并获得一组80个点。在这组平均点上,我们执行Delaunay三角剖分。Delaunay三角剖分的结果是由80点数组中的点的索引表示的三角形列表。在这种特殊情况下,三角剖分产生了149个三角形,将80个点连接在一起。三角剖分存储为三列数组。三角剖分的前几行如下所示。
38 40 37
35 30 29
38 37 20
18 37 36
33 32 30
…
它显示点38、40和37形成一个三角形,依此类推。三角剖分显示在下面的两个图像中。

请注意,两个图像中的三角形捕获了近似相似的区域。我们从点对应开始,现在由于三角剖分,我们有了三角形(或区域)对应。
3.扭曲图像和Alpha混合
现在,我们可以智能地融合两个图像。如前所述,混合量将由参数控制
。使用以下步骤创建变形。
- 在变形图像中找到特征点的位置:在变形图像中
,我们可以
使用等式(1)找到所有80个点的位置。 - 计算仿射变换:因此我们在图像1中有一组80点,在图像2中有另一组80点,在变形图像中有第三组80点。我们也知道在这些点上定义的三角剖分。在图像1中选择一个三角形,在变形图像中选择一个相应的三角形,并计算仿射变换,该仿射变换将图像1中的三角形的三个角映射到变形图像中相应的三角形的三个角。在OpenCV中,可以使用getAffineTransform完成此操作。为每对149个三角形计算仿射变换。最后,重复图像2和变形图像的过程。
- 变形三角形:对于图像1中的每个三角形,使用在上一步中计算出的仿射变换将三角形内的所有像素变换为变形图像。对图像1中的所有三角形重复此操作以获得图像1的变形版本。类似地,获得图像2的变形版本。在OpenCV中,这可以通过使用warpAffine函数来实现。但是,warpAffine会获取图像,而不是三角形。诀窍是计算三角形的边界框,使用warpAffine扭曲边界框内的所有像素,然后遮盖三角形外部的像素。使用fillConvexPoly创建三角形蒙版。使用warpAffine时,请确保使用blendMode BORDER_REFLECT_101。与克林顿国务卿掩盖她的电子邮件相比,它掩盖了接缝。
- Alpha混合变形图像:在上一步中,我们获得了图像1和图像2的变形版本。可以使用公式(2)将这两个图像进行Alpha混合,这是您最终的变形图像。在代码中,我提供了变形三角形和alpha混合,将它们合并在一个步骤中。
脸部变形结果
应用上述技术的结果如下所示。中间的图像是左右图像的50%混合。此页面顶部的视频显示了具有不同alpha值的动画。动画是一种廉价的技巧,可以将变形中的许多缺陷隐藏起来。特德·克鲁兹(Ted Cruz)参议员会喜欢的。
大多数面部特征都很好地对齐了。脸部以外的图像部分排列得不太好,因为在该区域中对应的点较少。可以手动添加其他点来修复错位并获得更好的结果。



总结:
point 68
point 80
delaunay 149
图1三角映射
图2三角映射
比例Alpha混合
Delaunay
原文:https://www.learnopencv.com/face-morph-using-opencv-cpp-python/
--
face morhper的更多相关文章
随机推荐
- pip 和pip3的区别
前言装完python3后发现库里面既有pip也有pip3,不知道它们的区别,因此特意去了解了一下. 解释先搜索了一下看到了如下的解释, 安装了python3之后,库里面既会有pip3也会有pip 1. ...
- 浦发银行网上银行U盾证书无法更新的解决办法
浦发银行需要更新证书.很多浦发客户都会碰到题主一样更新证书失败的困扰.网银登录似乎一切正常,可是等待进入个人网银时却跳出提示,如下图: 没有选择,只能点击确定,然后就是: 再“确定”下去: 再确定就出 ...
- (Linux基础学习)第一章:科普和Linux系统安装
第一章:科普和Linux系统安装 第1节:操作系统介绍OS:Operating System,通用目的的软件程序硬件驱动进程管理内存管理网络管理安全管理文件管理OS分类:服务器OS:RHEL,Cent ...
- python---Numpy模块中创建数组的常用方式代码示例
要机器学习,这方面内容不可少. import numpy as np import time # 对比标准python实现和numpy实现的性能差异 def sum_trad(): start = t ...
- 2019牛客多校第一场 A.Equivalent Prefixes
题目描述 Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r ...
- python_并发编程——锁
多进程模拟买票~ import time import json from multiprocessing import Process class Show(Process): #查 def run ...
- LG4783 【模板】矩阵求逆
P4783 [模板]矩阵求逆 题目描述 求一个$N\times N$的矩阵的逆矩阵.答案对$10^9+7$取模. 输入输出格式 输入格式: 第一行有一个整数$N$,代表矩阵的大小: 从第$2$行到第$ ...
- BAT文件的调用
分成2个步骤,首先生成一个bat文件,然后调用批处理文件 1.生成.bat文件 入参为文件的内容,filePath为绝对路径,且需要扩展名(这个方法不局限于生成.bat文件,也可以生成其他扩展名文件) ...
- Linux命令基础6-mkdir命令
mkdir是英文单词make directory的缩写.mkdir就是用来创建路径,一般就是用来创建文件夹的. 语法 mkdir (选项)(参数) 选项 -Z:设置安全上下文,当使用SELinux时有 ...
- 用jquery快速解决IE输入框不能输入的问题_jquery
代码如下: 在IE10以上版本,微软为了提高IE输入框的便利性,增加了文本内容全部删除和密码眼睛功能,但是有些时候打开新的页面里,输入框却被锁定无法编辑,需要刷新一下页面,或者如果输入框有内容需要点击 ...