该系列文章为 OpenCV+Python Tutorials的学习笔记
代码托管在Github
转载请注明: http://blog.csdn.net/a352611/article/details/51417779 [三记的博客]
写在文章开始之前:
关于几何变换,常见的资料都没有把数学原理部分讲透彻,基本都是照着课本说,导致我很多地方无法彻底理解.思前想后还是把这一块分成两个部分,一部分专门讲数学原理,一部分专门讲应用.本文为数学原理部分。
对图像的几何变换本质上是一种线性变换,其数学本质为
I n e w = T I o l d I_{new}= TI_{old} Inew=TIold
即通过变换矩阵 T T T将原图上的点的位置 I o l d I_{old} Iold变换到新的位置,从而得到新的图像 I n e w I_{new} Inew
2D平面变换示意图(“Computer Vision: Algorithms and Applications”, Richard Szeliski)
简单的说法就是对于点 P = [ x ; y ] T P=[x;y]^T P=[x;y]T我们无从得知这是一个点还是向量,之所以纠结这个概念的原因在于:平移对于向量没有意义,但对点有意义。我们希望对线性变换有一个统一的描述,结果发现在Homogeneous coordinates齐次坐标下我们能够和谐统一地描述这些。怎么把一个点转换到齐次坐标下来描述呢?很简单的一个方法是
直接将点 P = [ x ; y ] T P=[x;y]^T P=[x;y]T变为 P = [ x ; y ; 1 ] T P=[x;y;1]^T P=[x;y;1]T
而向量 P = [ x ; y ] T P=[x;y]^T P=[x;y]T变为 P = [ x ; y ; 0 ] T P=[x;y;0]^T P=[x;y;0]T
由于我们的变换矩阵是一个3x3的矩阵,最后一列的意义就是平移,这样就实现平移对向量无效,也能让线性变换统一写为 P n e w = T P o l d P_{new}=TP_{old} Pnew=TPold T T T为变换矩阵,最后还要从齐次坐标转换回我们的欧几里得坐标。
完整的Homogeneous coordinates概念请翻阅"Multiple View Geometry in computer vision", Richard Hartley and Andrew Zisserman
平行线相交于一点
T = [ f x 0 0 f y ] 其 次 坐 标 下 T = [ f x 0 0 0 f y 0 0 0 1 ] T= \left[ \begin{array}{ccc} f_x&0\\ 0&f_y\\ \end{array} \right] 其次坐标下 T= \left[ \begin{array}{ccc} f_x&0&0\\ 0&f_y&0\\ 0&0&1\\ \end{array} \right] T=[fx00fy]其次坐标下T=⎣⎡fx000fy0001⎦⎤
f x , f y f_x,f_y fx,fy分别为x方向和y方向的缩放系数
T = [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] 其 次 坐 标 下 T = [ c o s ( θ ) − s i n ( θ ) 0 s i n ( θ ) c o s ( θ ) 0 0 0 1 ] T= \left[ \begin{array}{ccc} cos(\theta)&-sin(\theta)\\ sin(\theta)&cos(\theta)\\ \end{array} \right] 其次坐标下 T= \left[ \begin{array}{ccc} cos(\theta)&-sin(\theta)&0\\ sin(\theta)&cos(\theta)&0\\ 0&0&1\\ \end{array} \right] T=[cos(θ)sin(θ)−sin(θ)cos(θ)]其次坐标下T=⎣⎡cos(θ)sin(θ)0−sin(θ)cos(θ)0001⎦⎤
只有齐次坐标系下的表示
T = [ 1 0 t x 0 1 t y 0 0 1 ] T= \left[ \begin{array}{ccc} 1&0&t_x\\ 0&1&t_y\\ 0&0&1\\ \end{array} \right] T=⎣⎡100010txty1⎦⎤
t x , t y t_x,t_y tx,ty分别为x方向和y方向的平移距离
T = [ a 0 a 1 a 2 a 3 a 4 a 5 0 0 1 ] T= \left[ \begin{array}{ccc} a_0&a_1&a_2\\ a_3&a_4&a_5\\ 0&0&1\\ \end{array} \right] T=⎣⎡a0a30a1a40a2a51⎦⎤
T = [ H 0 H 1 H 2 H 3 H 4 H 5 H 6 H 7 H 8 ] T= \left[ \begin{array}{ccc} H_0&H_1&H_2\\ H_3&H_4&H_5\\ H_6&H_7&H_8\\ \end{array} \right] T=⎣⎡H0H3H6H1H4H7H2H5H8⎦⎤