赞
踩
在图像拼接领域中,透视矩阵起着至关重要的作用,网络上关于这一知识的介绍已经很多,本人在此稍加总结和归纳一下,也方便自己今后查找一些结论性的要点(别人的再怎么好,还是自己的看起来舒服:)),接下来,就让我们对透视矩阵做一番深入性的认识吧。
我们所说的透视矩阵实际上是一个3x3维的矩阵,图像经过它的变换后(即用图像像素矩阵乘以该透视矩阵),可以呈现出各种透视和仿射效果:
简单看一眼上图,基本可以从图中看出仿射变换和透视变换的区别:仿射变换可以把图像放大、缩小、旋转、或者是变成平行四边形,而透视变换除了获得仿射变换的这些效果之外,还能将图片变成梯形。
稍微了解了透视矩阵的用途之后,我们来看一下透视矩阵的真正面目吧,它的一般表达形式为:
只是我们在计算完透视矩阵之后都会把H矩阵的所有元素都除以a33,于是,我们最后得到的H矩阵是这样的:
——式2.1
x和y分别为变换后图像的横坐标和纵坐标。
透视矩阵中的元素组合有着其特殊功能:a11、a12、a21、a22能控制图像的缩放、修剪以及旋转,a31、a32能控制图像的平移,a13、a23能将图像进行透视变换。
既然透视变换包括了仿射变换,在这里让我们先来了解一下基本的仿射变换吧:
——纵向剪切——横向剪切 ——相当于横向剪切和纵向剪切的组合
变换效果如下:
4、旋转变换(rotation)
指的是将图像以其中心位置旋转某一角度,其变换矩阵为:变换效果如下:
如果需要对图片进行一个简单的仿射变换,我们可以用几个不同功能的仿射矩阵进行组合:img*H1*H2*H3(img代表的是图像矩阵,H1是第一次变换的矩阵,H2是第二次变换的矩阵,H3是第三次变换的矩阵)
在此附一小段matlab代码,大家可以更改里面的透视矩阵H,看看经过各种透视变换后的图片效果:下图列出了一些常用的转换矩阵(该图来源于网络,在此对矩阵做了转置处理):
我们写代码时,需要定义一个新图像变量以接收这个变换后的图像,那这个新图像的大小该如何确定呢?(第一次写这代码时发现拼接结果不对,调试半天后发现是定义这个新图像时没有赋予正确的尺寸)
其实很简单,我们只需要确定原图像四个顶点经过透视变换计算后的新坐标,即可确定新图像的大小。
按照这个思路,将原图四个顶点的坐标分别代入2.3式中的u和v变量,可以得到转换过后的顶点坐标:由以上四个坐标可以获得变换后的图像尺寸:
要计算透视矩阵,我们还是要回到公式2.3,透视矩阵所求的变量共有8个(a33=1,其余都是要求的对象),根据方程组求解的基本知识,我们需要8个等式才能求出这8个变量,而取4对匹配点代入公式2.3正好可以组成8个等式,剩下的就是方程组求解的问题了。
在此顺带一提,如果你已经知道图片将要变换后的样子(比如要将图片变形放入某一固定模板),四个顶点正好可以作为四个匹配点代入上式,从而获得透视矩阵。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。