Image Warping-Morphing 实现人脸渐变

article/2025/9/4 18:48:12

这学期选修了计算机视觉与模式识别这门课,刚上几周,感觉挺有趣的。

课程上到Image Warping & Morphing的时候老师介绍了一样挺好玩的东西,我用它来做人脸渐变。

先看看效果图:


。。。。。。。。。。。。。。。。。。。。。。。。


简单介绍一下过程(我用的是matlab实现,因为matlab自带的函数还有矩阵运算实在太强大了,让我省掉好多功夫,可能以后还会用c++写一遍):

1、分别在原图和目的图上面标注特征点,并且把所有点的坐标记录下来,例如:

(说白了做的主要是五官的渐变,把五官用特征点标出来,当然可以用人脸识别的方法代替我手工标记。。。但知识和时间有限没有实现识别的代码,只能手动操作,以后补上)


2、有了所有这些特征点之后做三角剖分:(后面步骤介绍其作用)

就是每三个点画成一个三角形,互不相交的,得到的就是这样子:

(matlab有自带三角剖分的函数,delaunay,用法百度一下一堆)


3、求出当前所要画的中间过程图的每个点的像素值:

其实要画出中间过程图的是怎么做的呢?就是画出每个像素点的像素值!那我怎么知道像素值是多少,那当然是原图和目标图上对应点的像素值的加权平均啊,取系数不同就可以画出不同的中间过程。说白了我要找到原图和目标图上对应像素点读取像素值,首先我就要找到对应像素点的坐标!

所以我们引入三角剖分,目的就是找出对应点的坐标,用一个例子来说明:

假设ABC是原图上的三角形,A'B'C'是我变换过程中图上对应的三角形


我们将左边的点弄成齐次矩阵,即:A的坐标矩阵就是[x; y; 1](注意这是3*1的),BC同理,ABC就是一个3*3的矩阵[A,B,C],然后我们定义一个3*3的M矩阵,M*ABC = A‘B'C';然后就有M = A‘B’C'*inv(ABC),inv是求逆。

这个矩阵可以推广到所有点,所以我们要找对应点的位置,就可以用该点的坐标,左乘inv(M),就得到原图上对应点的坐标啦!再读取一下像素值,这样就OK啦!

这里还有一个小技巧,做双线性插值,效果会比较好,但是我的图才几百乘几百差不了多少,所以我没做。

4、将所有点的像素值输出到图像上,matlab的imwrite,大功告成。。。

展示一下我做了几个效果图:

me to Harden:


me to Leon:



matlab代码:

clear all close all%原图~目标图
%图片读入到矩阵
originG = imread('%图片地址');
targetG = imread('');%图片特征点,我是存到txt里面然后读取
originT =  load('%txt文件地址');
targetT =  load('');
num = size(originT, 1);
%三角剖分
TRI = delaunay(originT(: , 1), originT(: , 2));
%中间图的特征点
medT = zeros(num, 2);P = 0.1 : 0.1 : 0.9;
for j = 1: 9%求出中间图特征点位置for i = 1: nummedT(i, 1) = P(j)*(targetT(i, 1) - originT(i, 1)) + originT(i, 1);medT(i, 2) = P(j)*(targetT(i, 2) - originT(i, 2)) + originT(i, 2);end%先弄一个全零矩阵,用来存中间图每个像素点像素值medG = zeros(300, 200, 3);for x = 1: 300for y = 1: 200for k = 1: size(TRI, 1)mX = medT(TRI(k, :), 1);  %某个三角形3个定点的x值mY = medT(TRI(k, :), 2);%判断点是否在三角形内[IN, ON] = inpolygon(x, y, mX, mY);if ON == 1 || IN == 1m0 = [mX, mY, ones(3, 1)]';m1 = [originT(TRI(k, :), 1), originT(TRI(k, :), 2), ones(3, 1)]';  %向原图转换tran1 = m1 * m0^-1;pos1 = tran1 * [x; y; 1];m2 = [targetT(TRI(k, :), 1), targetT(TRI(k, :), 2), ones(3, 1)]';  %向目标图转换tran2 = m2 * m0^-1;pos2 = tran2 * [x; y; 1];medG(x, y, :) = (1-P(j)) * originG(round(pos1(1,1)), round(pos1(2,1)), :) + P(j) * targetG(round(pos2(1,1)), round(pos2(2,1)), :);break;endendendend%画图filename = ['%存放地址', num2str(j), '.jpg'];imwrite(uint8(medG), filename, 'jpg');
end
挺详细了,就这样吧!谢谢阅读!


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

相关文章

android按钮详解,android-morphing-button

从一种形状变成另一种形状。 你可以轻易的继承MorphingButton来添加自己的行为(behaviour),下面是一个继承自MorphingButton的ofLinearProgressButton。 示例代码// sample demonstrate how to morph button to green circle with icon MorphingButton btnMorph (M…

基于StyleGAN的Face-Morphing

本文详细介绍了生成对抗网络(GAN)的知识,并用其变换人脸,并探寻如何利用StyleGAN生成不同属性(如年龄、微笑等)的人脸。 概述 直到最近,我才开始探索深度学习的全部内容,并在计算机…

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

提了好几天的人脸融合技术,今天终于被提上日程,该技术是基于之前介绍的技术基础上延伸得到的,如果之前没有了解过这两篇文章,建议提前看下, 实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你&…

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(图像处理器,…