您的位置:首页 > 其它

仿射变换&透视变换

2017-04-13 20:36 274 查看
图像处理中主要涉及两种几何变换:仿射变换和透视变换。

Sec1. 仿射变换

仿射变换描述二维坐标下的变换操作,主要包括:平移(Translation)、旋转(Rotation)、缩放(Scale)、翻转(Flip)、错切(Shear)几种,每种操作均可以表示为矩阵的形式。尤其注意的是,图像经过仿射变换后,原来的直线和平行线,仿射变换之后仍然为直线和平行线。

平移变换

[x′y′]=[1001txty][xy]

旋转变换(绕原点逆时针旋转角度θ)

[x′y′]=[cos(θ)sin(θ)−sin(θ)cos(θ)][xy]

缩放变换

[x′y′]=[sx00sy][xy]

翻转变换(以x轴翻转变换为例)

[x′y′]=[−1001][xy]

错切(以x轴错切为例)

[x′y′]=[10bx1][xy]

综上所述,仿射变换的基本形式可以综合表述为,

[x′y′]=[m11m21m12m22b1b2][xy]

变换矩阵M表示旋转缩放翻转错切参数,矩阵B表示平移参数,

M=[m11m21m12m22]B=[b1b2]

所以仿射变换可以由6个自由参数来表达。

2.透视变换

相比于仿射变换,透视变换描述的是三维坐标下的变换操作,它其实就是小孔成像模型的变换矩阵,变换结果就是摄像头采集实际物体获得的图像。(个人感觉这与立体几何中的单应矩阵是一个概念)基本形式为,

⎡⎣⎢x^′y^′z^′⎤⎦⎥=⎡⎣⎢h11h21h31h12h22h32h13h231⎤⎦⎥⎡⎣⎢xy1⎤⎦⎥

[x^′,y^′,z^′]是齐次坐标表示,真正的坐标[x′,y′,1]为[x^′z^′,y^′z^,1]。可以求解得到坐标值为,

x′=x^′z^′=h11∗x+h12∗y+h13h31∗x+h32∗y+1(1)

y′=y^′z^=h21∗x+h22∗y+h23h31∗x+h32∗y+1(2)

可以看出,透视变换方程中,每个匹配点对可以贡献两个求解方程,而透视变换矩阵中共存在8个未知数,因而至少需要4个匹配点对才可以求解透视变换方程;相比而言,仿射变换矩阵中存在6个未知数,则至少需要3个匹配点可以求解。

关于该矩阵的求解是这样的:有一个对点(x,y)和(x′,y′)时,由公式(1)和(2)可以推导得到

x′∗(h31∗x+h32∗y+1)=h11∗x+h12∗y+h13

y′∗(h31∗x+h32∗y+1)=h21∗x+h22∗y+h13

这可以写成矩阵相乘的形式,

ah=v

其中,

h=[h11,h12,h13,h21,h22,h23,h31,h32]T

a=[x0y0100x0y01−xx′−xy′−x′y−yy′]

v=[x′,y′]T

那么,有N个点对时,依次按照矩阵a的方式罗列成多行,构成矩阵A,

A=⎡⎣⎢⎢⎢a1a2...aN⎤⎦⎥⎥⎥

同理得到矩阵V,

V=⎡⎣⎢⎢⎢v1v2...vN⎤⎦⎥⎥⎥

求解方程Ah=V,得到的解h即为透视变换矩阵。我们已经知道,透视变换矩阵包含8个未知数,则至少需要4个点对才可以求解,而当点对的数量多于4个点对时,此时的方程为超定方程,可以通过最小二乘或SVD的方式求解。在matlab中,可以通过左除的方式求解。

h = A\V;


另外,在matlab中求解变换的矩阵的过程封装在函数fitgeotrans()中,在下面图像拼接的例子中会使用该函数求解两个图像的变换矩阵。

例子(该例子取自Rich Radke的公开课 https://www.youtube.com/playlist?list=PLuh62Q4Sv7BUf60vkjePfcOQc8sHxmnDX):假设有两张待拼接的图像I和J,这里采用手动选择若干匹配点的方式来求解变换矩阵(当然可以采用特征点的方式,这里只是采用手动选择匹配点对来进行说明)。

图像I和J分别为,





代码,

%I and J is two image,pt1 and pt2 is the corresponding matching points
function out = mosaic2(I, J, pt1, pt2)

s = size(I);
%compute transformation matrix
T = fitgeotrans(pt1, pt2, 'projective');

Iregistered = imwarp(I, T, 'OutputView',imref2d([s(1), 2*s(2)]));
Jregistered = imwarp(J, affine2d(eye(3)),'OutputView',imref2d([s(1), 2*s(2)]));

%combine two warpping image
Jmask = any(Jregistered,3)>0;
out = Iregistered;

nonempty = find(Jmask>0);

%set rgb channel value
out(nonempty) = Jregistered(nonempty);
out(nonempty+size(out,1)*size(out,2)) = Jregistered(nonempty+size(out,1)*size(out,2));
out(nonempty+size(out,1)*size(out,2)*2) = Jregistered(nonempty+size(out,1)*size(out,2)*2);

figure;
imshow(out);

end


拼接结果图,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息