二维图像的三角形变换算法解释

http://blog.csdn.net/aqua_aqua/article/details/407660

对于二维图像的变形,最简单直接的方式就是将需要变形的不规则区域进行三角形划分,使复杂多边形由1到N个三角形组成,那么最终的变形动作也就转化为这些三角形变形。

三角形变形,就是将一个三角形通过某种变换变成另一个三角形,同时也要保证在源三角形中的点能够正确映射到目标三角形中合适的位置。如下图所示:

图中△ABC是源三角形,Z点是源三角形中的任意一点。△abc为目标三角形,而z点就是源三角形中Z点的变换后点。很自然这中间就存在一个变换关系f的存在,根据这个变换关系,可以可△ABC中的每个点都在△abc找到合适的位置。这种从源三角形中的点出发,根据变换关系,算目标三角形的点的方式,称之为正向变换。此种变换的适合于在目标三角形中找出源三角形的某一点,但是对于二维图像变形,是需要将源三角形区域内的所有像素都映射到目标三角形中,而两个三角形的形态、大小不可能一样,所以最终所造成的结果可能是目标三角形中有的像素未接受到映射,形成空洞。

还有一种变换方式是从目标三角形中的点去找其在源三角形中的位置,这称为逆向变换。对于需要将整个源三角形都映射到目标三角形的情况,这种方式要更适合。因为这样可以使目标三角形完全被填充,不至于出现空洞。所以本文中采用了这种逆向变换方式。

而上述两种变换方式也有所通常所采用的方法也是以二维矩形来表示一个坐标点(源坐标或目的坐标),然后经过一系列平移、缩放、错切变换等矩阵运算,来算出另一映射坐标点(目的坐标或源坐标),虽然其结果比较精确,但是这样一个过程是相当复杂,且运算量大。另一种近似算法:利用源三角形和目标三角形各个顶点的对应,通过线性插值,算出源和目的每条边的映射关系,再将相邻边上的点进行连接,再次运用线性插值,最后得到了两三角形内任意点之间的映射对。相对而言,第二种算法运算量要小很多,且容易理解,

以下图中源三角形△ABC和目标三角形△abc为例,A点的对应点为a,B点对应点为b,C点对应点为c。现在要找出目标三角形△abc中z点在源三角形△ABC的对应的Z点坐标。具体算法:

1.       过d点做水平线,找到其与△abc的两个交点。设与ab边交点为e,与ac边交点f。

2.       根据△ABC与△abc三个顶点的对应关系,算出e、f两点在△ABC的AB边和AC边上的对应点E、F。

3.       最后由z点在ef点连线的位置,可以得到EF点连线上Z点的位置。

在这个算法中只用到了最简单的线性插值技术和基本的直线到表达式,避免了繁琐的矩阵运算。在具体的实现过程中,因为是对目标三角形中每点进行填充,所以还运用到了扫描线技术。

在具体实现,由代码表示,此处只是给出了其流程。

a.       对目标三角形abc中的三个点进行某种序列的排序,使其便于以后运算。此处设最高点为a点,依次为b、c点。如出现水平线,则左点在前。

b.       如果目标三角形中存在水平线,则先找到水平线在源三角形的对应线。因为此次变换主要运用提直线的两点表达式,这个表达式中对于水平的表示需要特殊处理。

c.       从高点a点后下进行水平扫描,每条水平线都会与△abc存在两个交点,找到这个两个交点e、f点,

d.       根据两点所在边与其在△ABC中对应边的关系,找到源三角形中的E、F点。

e.       对e、f点之间的连线进行遍历,找到其线上各点在△ABC中EF点连线的位置,

f.        找到相应位置也就找到了相应的原始像素,因为在一般情况下找到的原始点坐标都是一个实数,不是整数,所以取原始点的颜色还需要对此位置四周的颜色进行双线性插值,才能找到最终所需要的颜色。

注意,在对颜色进行线性插值时,要对三原色分别进行插值。

另外,对于大区域的变换时,可以多线程技术,对三角形的区域进行多点同时进行转换。

时间: 2025-01-05 17:20:34

二维图像的三角形变换算法解释的相关文章

二维图像的投影和图像重建分析之傅里叶变换法

摘要:图像重建有变换法和迭代法,本文主要分析变换法.根据二维图像的投影,与其傅里叶变换之间的关系,得出图像重建的4种方法,直接傅里叶反变换.先反投影后滤波.先滤波后反投影.卷积反投影.直接傅里叶反变换法利用中心切片定理,先求投影数据的一维傅里叶变换,然后二维插值栅格化得到二维傅里叶变换数据,逆变换后得出目标图像.先反投影后滤波是将投影数据直接反投影,然后频域中通过二维锥形滤波,得到目标图像.先滤波后反投影时在反投影前对数据修正(滤波),卷积反投影与其类似,只是将频率中滤波拿到时域中做卷积运算.对

二维图像到二维屏幕的投影 用例

说明 在默认的2D渲染中,渲染的X,Y轴的范围都是从[-1, 1],屏幕的中心点(0,0),所以鼠标点击的坐标,必须转换成世界地理坐标系,在2D环境下,默认Z轴坐标为0.0 假设屏幕宽800,高4800 屏幕坐标 地理坐标 左上角 0,0 -1,1 左下角  0,480 -1,-1 右上角  800,0           1,1 右下角  800,480         1,-1 现在通过gluOrtho2D函数将二维图像到二维屏幕上的投影,将坐标移动到左下角,方向刚好和屏幕坐标的Y轴相反 代

[理论基础]二维图像滤波处理的理论基础

两个信号在时域的卷积等于频域的乘积.而二维图像常用的滤波处理,就是二维图像与一个3*3或者5*5的滤波数组的卷积,对应于该二维图像与 滤波数组经过傅里叶变换到频域后数据的乘积.正式因为这个数学特征,使得我们在时域看起来很难处理的频率滤波,在频域非常容易得以实现. 通过下面的3张图,很容易理解图像数据里高频信号和低频信号的概念: 1.原图及傅里叶变换幅度(左下)与相位图(右下) 2.傅里叶变换幅度图中心圆外面部分(高频部分)全零与反傅里叶变换后的原图 3.傅里叶变换幅度图中心圆里面部分(低频部分)

用Matplotlib绘制二维图像

唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理,然后调用Matlib来画图,另外,还可以使用Matplotlib,它是用Python写的类似Matlib的库,能实现Matlib的功能,而且画图的质量很高,可用于做论文发表.找了一天的资料,终于出图了. Matplotlib需要配合numpy,scipy才能使用,具体安装步骤稍后补充. 正文: 用M

二维图像频谱中的两点表示什么

冈萨雷斯版<图像处理>里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜.棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定. 傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分.当我们考虑光时,讨论它的光谱或频率谱.同样, 傅立叶变换使我们能通过频率成分来分析一个函数. 图像傅立叶变换的物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度.如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低:而对

二维图像插值算法实现

在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要依据邻近象素的值来对该坐标进行插值.比如:做地图投影转换,对目标图像的一个象素进行坐标变换到源图像上对应的点时,变换出来的对应的坐标是一个小数,再比如做图像的几何校正,也会碰到同样的问题.看够了各种数学原理,直接上具体的实现步骤.no公式no理论,以下是对常用的三种数字图像插值 方法进行介绍. 1.最近邻插值法(Nearest Neighbour Interpolation) 这是最简单的一种插值方法,不需要计算,在待求象素的四邻象

发票二维码扫描增强_02_算法概述

技术选型 为了解决二维码无法扫描的问题,必须选择合适的技术手段.由于我们的App引用的是别人开发的基于Zbar的图像识别插件,在没有能力修改图像识别插件的前提下,我决定在服务端解决这个问题,考虑到算法的通用型,在服务端验证通过的程序后期也可以考虑移植到App端,提高本地扫描速度,降低服务器性能消耗.IOS和Android的插件都存在相机对焦完成的事件,在该事件中可以拿到图像信息,我计划在拿到对焦完成的图片后,进行简单压缩后传输至服务器进行解析处理,再将服务器返回的解析结果作为解码结果传递给前台应

python二维图像输出操作大全(非常全)!

//2019.07.141.matplotlib模块输出函数图像应用时主要用的是它的ptplot模块,因此在导入使用该模块时可以直接用以下语句:import matplotlib.pyplot as plt2.matplotlib模块输出图线时它得到坐标轴数值以及标题正常默认是英文形式,而如果需要在转换成为中文形式并且需要正常输出负号则需要用以下两句python语句设置一下,这样便可以正常输出中英文两种形式标题与带负号的坐标数值:plt.rcParams["font.sans-serif&quo

二维图像到二维屏幕的显示,对应屏幕坐标

说明 默认情况下,中心点在屏幕的中心,范围都是从[-1,1],所以物体的实际坐标映射到屏幕坐标需要一个转换过程,上文中描述到使用gluOrtho2D函数通过正投影,将物理坐标映射到屏幕坐标,但是坐标的原点在左下角,一般情况下,屏幕的原点都是从左上角开始,因此在上述的所有例子中,都需要重新计算Y轴的坐标,屏幕的高减去点Y轴分量.现在通过重新设置正射投影的左下角坐标和右上角的坐标,建立一一对应的关系,而不再需要进行任何的转换,类似于旋转相机,达到调整坐标系的作用 代码 #include <gl/gl