仿射变换&透视变换
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中,可以通过左除的方式求解。
另外,在matlab中求解变换的矩阵的过程封装在函数fitgeotrans()中,在下面图像拼接的例子中会使用该函数求解两个图像的变换矩阵。
例子(该例子取自Rich Radke的公开课 https://www.youtube.com/playlist?list=PLuh62Q4Sv7BUf60vkjePfcOQc8sHxmnDX):假设有两张待拼接的图像I和J,这里采用手动选择若干匹配点的方式来求解变换矩阵(当然可以采用特征点的方式,这里只是采用手动选择匹配点对来进行说明)。
图像I和J分别为,
代码,
拼接结果图,
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
拼接结果图,
相关文章推荐
- OpenCV 可自动调整参数的透视变换
- 透视变换warpPerspective和GetPerspectiveTransform函数
- 图像处理】透视变换 Perspective Transformation
- OpenCV—透视变换warpPerspective
- 透视变换
- 透视变换
- 飞越星空屏保实现:3D数学之透视变换
- 【图像处理】透视变换 Perspective Transformation
- OpenCV】透视变换 Perspective Transformation(续)
- 图形学中的透视变换
- OpenCV 透视变换实例
- opencv透视变换
- 仿射变换与透视变换
- OpenCV透视变换
- 【OpenCV】透视变换 Perspective Transformation(续)
- 【OpenCV】图像变换(五)-仿射变换和透视变换
- 车载环视拼接系统的设计与实现(四):透视变换与图像拼接
- Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)
- 透视变换
- 【图像处理】透视变换 Perspective Transformation