OpenCV:图像变形(Image Morphing)

article/2025/9/4 21:55:02

融合/形变技术

Image Morphing的原理是十分简单的。有两幅图像 IJ ,我们希望通过融合图像 IJ 来创建一幅新的图像 M. 图像 IJ 的融合过程是由参数 alpha 来控制,参数 alpha 介于0和1之间。当alpha = 0,新的图像 M看起来更接近 I;当alpha = 1,新的图像 M看起来更接近 J。可以通过以下的方程来进行融合:
在这里插入图片描述
然而,令alpha = 1/2 利用以上的方程融合的结果如下图所示,结果并不令人满意:
在这里插入图片描述
以上图片中中间的是最终融合结果,效果不容乐观。我们希望在进行融合之前将眼睛和嘴巴等相似部位进行一定程度的对齐。
所以,为了将图像 I 形变到图像 J,我们首先需要在两幅图片之间建立一些像素的对应关系。换句话说,在图像 I 中的每一个像素(xi,yi),我们希望在图像 J 中找到对应的像素点(xj,yj)。如果我们呢可以找到这种像素间的对应关系,那么我们就可以通过两个步骤来进行融合。第一:计算图像 M 中像素位置坐标(xm,ym),可通过以下方程进行:

第二我们需要找到像素点(xm,ym)处的像素灰度值:

通过以上两步,就可以实现我们的目标。然而找到两幅图片中一一对应的像素是非常困难的,我们可以通过找到少量的对应点来替代。

脸部变形步骤

1. 利用面部特征检测找到对应点

在这里插入图片描述
首先利用面部特征检测来自动找到许多对应点。在此利用dlib 来监测到68个对应点。下一步,额外添加四个点(一个在左耳,一个在脖子,两个在肩膀);最终再添加一些图像的角点和这些角点之间的点作为对应点。

2. 三角剖分

经过以上的步骤之后,我们一共得到两个集合A, B(每个图像对应一个集合),每个集合包含80个点的坐标信息。每个点对表示当前图像中对应点的坐标信息。A, B中的点都是一一对应的(比如希拉里左侧眼角左边的点在A中的位置索引和参议员泰德左侧眼角左边的点在B中的位置索引是一样的)。下图分别是集合A和B中的点,每行表示一个点。

在这里插入图片描述
利用前述方程可以计算出一个新的集合C,新的集合表示融合以后的图像中这些点所在的坐标位置,新集合中每个元素表示一个点。在这个新的集合C运用Delaunay三角剖分,Delaunay三角剖分的结果是新的集合中所有点构成的三角形,三角剖分中每个元素暗示了构成一个三角形的三个点在C中的位置索引。以下是三角剖分的结果,每一行表示一个三角形。

因为集合C的点的坐标位置是根据集合A,B中坐标位置计算出来的,所以三者之间的点有对应关系,利用三角剖分的结果在集合A和b上显示如下图。可以注意到三角形之间区域近似相似。现在我们有了对应区域,就可以进行融合。

图片扭曲和alpha融合

图片融合的效果将由参数alpha来控制,并通过以下步骤实现:

1. 在融合的图片中找到特征点的位置:

在新的图像M中,根据方程1可以找到所有80个点的位置信息。

2. 计算仿射变换:

目前我们在图像 I中有80个点(集合A),图像 J中有80个点(集合B),融合的图像 M中有80个点。由80个点所组成的三角形信息也存储在三角剖分的结果中。我们在图像I中取出一个三角形,与图像M中对应的三角形之间计算仿射变换,OpenCV中函数getAffineTransform可以实现这个操作。每个图像共被分为总共149个,为 IM之间的每一对三角形计算仿射变换。最终在JM之间重复这一步骤。

3. 扭曲三角形

对于图像 I中的每一个三角形,利用上一步中得到的仿射变换矩阵,将三角形中的所有像素扭曲到目标图像中的对应三角形中,重复所有三角形得到一个图像I的扭曲版本。同样的操作得到一个图像J的扭曲版本。在OpenCV中可以利用 warpAffine函数来实现。然而,warpAffine是对一幅图像进行操作而不是三角形,一个可行的办法是为每个三角形求一个最小包围矩形,对包围矩形利用warpAffine进行扭曲,然后利用掩模操作将三角形以外的区域去掉。三角形淹没可以利用fillConvexPoly(函数FillConverExpoly根据多边形顶点绘制一个填充的凸多边形)创建。在利用函数warpAffine 的时候要使用荣火热模式 BORDER_REFLECT_101,该模式可以很好的隐藏缝隙。

4. 对扭曲的图像进行Aihpa融合

上一步骤得到了图像I和图像J的扭曲版本,利用方程2对他们继续融合,就能得到我们的结果M.
在这里插入图片描述


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

相关文章

计算机动画作业:图像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&#…

CUDA是什么-CUDA简介

在大家开始深度学习时&#xff0c;几乎所有的入门教程都会提到CUDA这个词。那么什么是CUDA&#xff1f;她和我们进行深度学习的环境部署等有什么关系&#xff1f;通过查阅资料&#xff0c;我整理了这份简洁版CUDA入门文档&#xff0c;希望能帮助大家用最快的时间尽可能清晰的了…

java队列和栈 共同_java 栈和队列的模拟--java

栈的定义&#xff1a;栈是一种特殊的表这种表只在表头进行插入和删除操作。因此&#xff0c;表头对于栈来说具有特殊的意义&#xff0c;称为栈顶。相应地&#xff0c;表尾称为栈底。不含任何元素的栈称为空栈。 栈的逻辑结构&#xff1a;假设一个栈S中的元素为an,an-1,..,a1&am…

栈和队列学习总结

一、栈 1、特点及应用 先进后出。(如果会和队列先进先出记混的话,就记场景吧:弹栈弹栈,就是把最上面的最新进来的弹出去;而队列就像我们火车站排队检票出站一样,谁排在前面谁就先出去。) 应用的话,其实我们经常接触呀。比如Undo操作(就是撤销操作)就是使用的栈的思想…

栈和队列的共同点和不同点

堆栈都是一种数据项按序排列的数据结构&#xff0c;只能在一端(称为栈顶(top))对数据项进行插入和删除。 要点&#xff1a;堆&#xff1a;顺序随意 栈&#xff1a;后进先出(Last-In/First-Out) 堆 堆&#xff1a;什么是堆&#xff1f;又该怎么理解呢&#xff1f; ①堆通常是一…

栈和队列实现和实例分析

目录 前言栈队列实例分析结语 前言 本篇文章主要讲述数据结构中栈和队列的实现&#xff0c;以及相关实例分析。 栈 注意本文所讲述的栈是数据结构的一种&#xff0c;并不是内存划区中的栈区&#xff0c;但是这两者有相似之处&#xff0c;即&#xff1a;存储数据时满足数据先…

栈和队列的共同处和不同处

共同处 栈和队列的共同处是&#xff1a;它们都是由几个数据特性相同的元素组成的有限序列&#xff0c;也就是所谓的线性表。 不同处 队列 队列&#xff08;queue&#xff09;是限定仅在表的一端插入元素、在另一端删除元素的线性表。 在队列中&#xff0c;允许插入的一端被…

索引的优缺点以及索引的设计原则

索引概述 索引&#xff08;index&#xff09; 是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0…

SQL数据库之索引优缺点

SQL数据库之索引使用原则及利弊 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 优点 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。 可以大大加快数据的检索速度&#xff0c;这也是创建…