人脸融合技术,用 Python - OpenCV 来帮你实现

article/2025/9/4 19:02:29

提了好几天的人脸融合技术,今天终于被提上日程,该技术是基于之前介绍的技术基础上延伸得到的,如果之前没有了解过这两篇文章,建议提前看下,
实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你!
利用 OpenCV-Python 进行人脸 Delaunay 三角剖分(人脸检测核心技术之一)

1,Image Morphing 介绍

图像融合简单来说,通过把图像设置为不同的透明度,把两张图像融合为一张图像(一般要求图像需要是等尺寸大小的),公式如下:
M ( x , y ) = ( 1 − α ) I ( x , y ) + α J ( x , y ) α 为 设 置 的 透 明 度 参 数 I ( x , y ) 为 图 像 I 坐 标 为 ( x , y ) 的 像 素 值 ; J ( x , y ) 为 图 像 J 坐 标 为 ( x , y ) 的 像 素 值 ; M ( x , y ) 为 融 合 之 后 图 像 的 像 素 值 ; M(x,y) = (1-\alpha)I(x,y)+\alpha J(x,y)\\ \alpha 为设置的透明度参数\\ I(x,y) 为图像 I 坐标为 (x,y) 的像素值;\\J(x,y)为图像 J 坐标为 (x,y) 的像素值;\\ M(x,y) 为融合之后图像的像素值; M(x,y)=(1α)I(x,y)+αJ(x,y)αI(x,y)I(x,y);J(x,y)J(x,y);M(x,y)
2,Image Morphing 简单尝试

可以根据这个公式尝试实现一下融合技术,利用 OpenCV 的 cv2.addWeighted() 函数,代码如下:

import cv2
import  numpy as npfile_path1 = "E:/data_ceshi/1.jpg"
file_path2 = "E:/data_ceshi/2.jpg"
img1 = cv2.imread(file_path1)
img2 = cv2.imread(file_path2)
morph_img = cv2.addWeighted(img1,0.5,img2,0.5,0)
save_img = np.hstack((img1,morph_img,img2))
cv2.imwrite("E:/data_ceshi/save.jpg",save_img)
cv2.imshow("morph_img",save_img)
cv2.waitKey(0)

这里 alpha 设置为 0.5, 最终结果如下图:

save.jpg

左右两边分别为欲融合的两张图片,中间的为最终的融合结果,看起来非常不好,图片中脸的部分的确融合了一步分但是给我们的感觉就是明显的失真效果,太假了

以上对人脸进行融合之前,若想要达到不错的效果需要对人脸区域进行对齐操作,而这一步就需要用到之前介绍的技术:人脸68个特征点提取Delaunay 三角剖分

3,特征点提取

在做人脸对齐时,不仅需要考虑人脸部分需要对齐,这里也需要考虑图片的整体性(例如头发、脖子、肩膀等部位),因此这里除去 dlib 提取68个特征点之外,又加入了12个特征点(人工标记)分别图像四角、四边中点、是肩膀处,右耳边缘、脖子等

circle.jpg

4,Delaunay 三角剖分

这里三角剖分目的网格化图像脸部区域,方便寻找特征点,为后面使用仿射变换进行对齐操作:

delaunay.jpg

从三角剖分图上来看,人脸区域轮廓是非常相似的,人脸融合时需要把脸部每一个对应的小三角区域事先一一对齐,然后利用设置的透明度参数来做最终的效果融合。这样结果就显得不那么失真。

5,脸部融合

下面将脸部融合技术拆解为几部分:

1,脸部特长点提取、三角剖分(前面已经详细介绍了,这里就不再一一展开了);

2,对 1 中的三角剖分每个顶点做对应点衔接并记录下来,对应点记录的是三角形三顶点的索引数,如下图所示:

Snipaste_2020-06-06_23-41-50.png

3,图片中对每一个三角剖分区域做放射变换,用到的函数:getAffineTransform() 得到仿射变换矩阵,warpAffine() 进行放射变换,最终得到两个变换图像,

4,对 3 中得到的两图像中像素值调整透明度参数,来进行图像融合

最终结果如下:

out_img.jpg

out_img.jpg

out_img.jpg

结果来看,脸部区域能够取得不错的结果,但整体来看仍然有很大的瑕疵,但是我们可以通过手动选择更多特征对应点来改善这种效果,最后附上完整代码

import cv2
import numpy as np
import sys#Read points from  text file
def readPoints(path):# Create an array of pointspoints = []# Read pointswith open(path) as file:for line in file:x,y = line.split()points.append((int(x),int(y)))return points# Apply affine tranform calculated using srcTri and sdtTri to src and output an image of size
def applyAffineTransform(src,srcTri,dstTri,size):#Given a pair of triangles,find the affine transform.warpMat = cv2.getAffineTransform(np.float32(srcTri),np.float32(dstTri))#Apply the Affine Transform just foundto the src imagedst = cv2.warpAffine(src,warpMat,(size[0],size[1]),None,flags=cv2.INTER_LINEAR,borderMode=cv2.BORDER_REFLECT_101)return dst# Warps and alpha blends triangular regions from img1 and img2 to img
def morphTriangle(img1,img2,img,t1,t2,t,alpha):#Find bounding rectangle for each triangler1 = cv2.boundingRect(np.float32([t1]))r2 = cv2.boundingRect(np.float32([t2]))r = cv2.boundingRect(np.float32([t]))# Offset points by left top corner of the respective rectanglest1Rect = []t2Rect = []tRect = []for i in range(0,3):tRect.append(((t[i][0] - r[0]),(t[i][1]-r[1])))t1Rect.append(((t1[i][0]-r1[0]),(t1[i][1]-r1[1])))t2Rect.append(((t2[i][0] -r2[0]),(t2[i][1]-r2[1])))# Get mask by filling trianglesmask = np.zeros((r[3],r[2],3),dtype = np.float32)cv2.fillConvexPoly(mask,np.int32(tRect),(1.0,1.0,1.0),16,0)# Apply warpImage to small rectangular patchedimg1Rect = img1[r1[1]:r1[1]+r1[3],r1[0]:r1[0]+r1[2]]img2Rect = img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]]size = (r[2],r[3])warpImage1 = applyAffineTransform(img1Rect,t1Rect,tRect,size)warpImage2 = applyAffineTransform(img2Rect,t2Rect,tRect,size)# Alpha blend rectangular patchesimgRect = (1.0-alpha) *warpImage1 +alpha*warpImage2# Copy triangular region of rectangular patch to tje output imageprint(r[1],r[3],r[0],r[2])print(imgRect.shape)img[r[1]:r[1]+r[3],r[0]:r[0]+r[2]] = img[r[1]:r[1]+r[3],r[0]:r[0]+r[2]]*(1-mask) +imgRect*maskif __name__ =='__main__':filename1 = "E:/data_ceshi/2.jpg"filename2 = "E:/data_ceshi/3.jpg"points_txt1 = "E:/data_ceshi/2.txt"points_txt2  ="E:/data_ceshi/3.txt"alpha = 0.5# Read imagesimg1 = cv2.imread(filename1)img2 = cv2.imread(filename2)# Convertat to float data typeimg1 = np.float32(img1)img2 = np.float32(img2)# Read array of corresponding pointspoints1 = readPoints(points_txt1)points2 = readPoints(points_txt2)points = []# Compute weighted average point coordinatefor i in range(0,len(points1)):x = (1-alpha) *points1[i][0] +alpha *points2[i][0]y = (1-alpha)*points1[i][1] + alpha*points2[i][1]points.append((x,y))imgMorph = np.zeros(img1.shape,dtype = img1.dtype)# Read triangles for tri.txtwith open("E:/data_ceshi/tri.txt") as file:for line in file:x,y,z = line.split()x = int(x)y = int(y)z = int(z)t1 = [points1[x],points1[y],points1[z]]t2 = [points2[x],points2[y],points2[z]]t = [points[x],points[y],points[z]]# Morph one triangle at a timemorphTriangle(img1,img2,imgMorph,t1,t2,t,alpha)# Display Resultsout_img = np.hstack((img1,imgMorph,img2))cv2.imwrite("E:/data_ceshi/out_img.jpg",out_img)cv2.imshow("Morphed Face",np.uint8(imgMorph))cv2.waitKey(0)

小总结

虽然本次面向对象是人脸,但相同技术原理也可以运用到其他物体上面,比如把苹果和橘子相融合、人脸区域更换等功能,如果有更好的 idea 的话,可能会得到意想不到的结果!

最后文章中完整源码和文件都已经打包到 Github 上去了,关注公众号: 小张Python,后台回复关键词 FaceMorph 即可获取.


http://chatgpt.dhexx.cn/article/G3aX2M6H.shtml

相关文章

FaceMorphing

大学时候上《计算机视觉与模式识别》课程的时候,一个人脸morphing作业的源代码,运行环境为VS2015。 项目源代码下载链接 效果图如下:

实时渲染(RealTimeRendering-4thEdition)笔记——4变换(下)

变换(下) 顶点混合(vertex blender)渐变(Morphing)Geometry Cache Playback投影(Projections)透视投影 顶点混合(vertex blender) 现在我们想象要完成一个手…

基于图像的虚拟换装:Morphing architectures for pose-based image generation of people in clothing

项目的重点是变形操作的特征化与实现,解决卷积神经网络中的信息失准问题。我们将所研究的方法应用到一个换衣服的任务中,将其建模为一个条件图像生成问题。尽管对抗性方法在生成性任务中很流行,但我们将此项目的范围限制为监督方法&#xff0…

Traffic morphing阅读笔记

文章目录 前言1 变形1.1 符号表示及算法讲解1.1.1 符号1.1.2 凸优化求解1.1.3 降低开销1.1.4大样本空间分治1.1.5实验中的注意事项短会话源分布变化多样数据包分片 2 实验评估2.1 加密IP语音识别白盒变形黑盒变形2.1.1 与原始分类器对抗二元分类器三元分类器 2.1.2 不可区分性评…

云波社区 l Mecha Morphing(变形机甲)游戏介绍

Mecha Morphing(变形机甲)由YGG领投的一个创新型GameFi项目即将开始打金! 简单介绍一下,该游戏由Call of duty核心团队研发,画风完美阐释暴力美学。在MechaMorphing元宇宙中,玩家可以通过参与PVE, PVP, 土地…

Real-Time Rendering——4.5 Morphing 变形

Imagine that one model is displayed at time t0 and we wish it to change into another model by time t1. For all times between t0 and t1, a continuous “mixed” model is obtained, using some kind of interpolation. An example of morphing is shown in Figure 4.…

《数字图像处理》dlib人脸检测获取关键点,delaunay三角划分,实现人脸的几何变换warpping,接着实现两幅人脸图像之间的渐变合成morphing

这学期在上《数字图像处理》这门课程,老师布置了几个大作业,自己和同学一起讨论完成后,感觉还挺有意思的,就想着把这个作业整理一下 : 目录 1.实验任务和要求 2.实验原理 3.实验代码 3.1利用人脸特征点检测工具dli…

OpenCV:图像变形(Image Morphing)

融合/形变技术 Image Morphing的原理是十分简单的。有两幅图像 I 和 J ,我们希望通过融合图像 I 和 J 来创建一幅新的图像 M. 图像 I 和 J 的融合过程是由参数 alpha 来控制,参数 alpha 介于0和1之间。当alpha 0,新的图像 M看起来更接近 I;当alpha 1&…

计算机动画作业:图像morphing

本学期选了计算机动画课程,第一次作业是图像morphing, 本来打算选择基于四边网格的morphing, 但因为要用到曲面插值,感觉比较麻烦,因此使用基于三角网格的face morphing。 一、总体方案 1、检测人脸特征点&#xff0…

Morphing

<script src"http://widgets.amung.us/classic.js" type"text/javascript"></script> <script type"text/javascript"> </script> Morphing 这篇文章给大家介绍一下morphing&#xff0c;它是一种变型动画&#xff0c;…

深度学习中的GPU与CUDA

对应视频教程&#xff1a;https://www.bilibili.com/video/BV1S5411X7FY/ 文章目录 1. 显卡&#xff08;GPU&#xff09;与驱动2. 显卡与CUDA3. 如何查看自己的显卡 1. 显卡&#xff08;GPU&#xff09;与驱动 显卡&#xff0c;也称之为 GPU。GPU 的全称是 Graphics Processin…

CUDA详解

CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构&#xf…

CUDA入门

1. 引言 CUDA为a platform and programming model for CUDA-enabled GPUs。该平台通过GPU来进行计算。CUDA为GPU编程和管理 提供C/C语言扩展和API。 CUDA编程中&#xff0c;会同时使用CPU和GPU进行计算&#xff1a; CPU system&#xff1a;称为host。GPU system&#xff1a;…

cuda和cudatoolkit

Pytorch 使用不同版本的 cuda 由于课题的原因&#xff0c;笔者主要通过 Pytorch 框架进行深度学习相关的学习和实验。在运行和学习网络上的 Pytorch 应用代码的过程中&#xff0c;不少项目会标注作者在运行和实验时所使用的 Pytorch 和 cuda 版本信息。由于 Pytorch 和 cuda 版…

最新CUDA环境配置(Win10 + CUDA 11.6 + VS2019)

最新CUDA环境配置(Win10 CUDA 11.6 VS2019) 本篇博客根据NVIDIA 官方文档所述, 并根据自己实践得出. 供各位需要的朋友参考. 1.前言 本篇文章的软件环境为: Windows 10CUDA 11.6VS2019 CUDA是目前做人工智能, 深度学习等方向的必备工具库. 由CUDA衍生出的加速工具很多, …

一文搞懂CUDA

什么是cuda 统一计算设备架构&#xff08;Compute Unified Device Architecture, CUDA&#xff09;&#xff0c;是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源&#xff0c;实现更高效的并行计算。 CUDA是NVIDIA公司所开发的GPU编程模型&#xff0c;它提供…

GPU,CUDA,cuDNN的理解

我们知道做深度学习离不开GPU,不过一直以来对GPU和CPU的差别,CUDA以及cuDNN都不是很了解,所以找了些资料整理下,希望不仅可以帮助自己理解,也能够帮助到其他人理解。 先来讲讲CPU和GPU的关系和差别吧。截图来自资料1(CUDA的官方文档): 从上图可以看出GPU(图像处理器,…

CUDA编程之快速入门

CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构。做图像视觉领域的同学多多少少都会接触到CUDA,毕竟要做性能速度优化,CUDA是个很重要的工具,CUDA是做视觉的同学难以绕过的一个坑,必须踩一踩才踏实。CUDA编程真的是入门容易精通难,具有计算机体…

CUDA学习

想想学习CUDA的时间也应该有十来天了&#xff0c;也该是做一个小总结了&#xff0c;说说我理解的CUDA&#xff0c;它到底是什么东西&#xff1f; 其实说到CUDA&#xff0c;还真的没几个人知道&#xff0c;说实话&#xff0c;我也听说不久&#xff0c;主要因为它2007年才刚发布&…

CUDA简介

CUDA简介 CUDA是什么 CUDA&#xff0c;Compute Unified Device Architecture的简称&#xff0c;是由NVIDIA公司创立的基于他们公司生产的图形处理器GPUs&#xff08;Graphics Processing Units,可以通俗的理解为显卡&#xff09;的一个并行计算平台和编程模型。 通过CUDA&#…