1、刚体变换:平移+旋转,只改变物体位置,不改变物体形状
2、仿射变换:改变物体位置和形状,但是保持“平直性”
3、投影变换:彻底改变物体位置和形状
齐次坐标到底是什么?
透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。
透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为:
(x,y,z) 为原始图像像素点的齐次坐标,(X’=X/Z,Y’=Y/Z,Z’ =Z/Z ) 为变换之后的图像像素点的齐次坐标。
即原始图像像素点的齐次坐标(x,y,z)对应得到变换后的图像像素点的齐次坐标(X’;Y’;Z’)其中Z’=1,则点(X’;Y’)就是原图像对应的像素点的二维平面坐标经过变换后的二维平面坐标:
透视变换矩阵图解如下:
其中
原始图像像素点的齐次坐标(x,y,z)对应变换之后的图像像素点的齐次坐标(X;Y;Z)。将Z归一化后,得到归一化后的齐次坐标(X’;Y’;1),则其变换之后的图像像素点的齐次坐标(X;Y;Z)对应的二维平面坐标为(X’;Y’)
即当齐次坐标Z’=1,则点(X’;Y’)就是原图像对应的像素点的二维平面坐标经过变换后的二维平面坐标:
一般地,我们令a33=1,展开上面公式,得到一个点的放射变换:
在这个方程中,总共有8个未知数,因此我们可以找到4对8个点(每个两个对应,原平面上的点和其对应映射到新的视平面的点为一对)
列出方程。解出,参数a11 、a12、a13、a21、a22、a23、a31、a32。
假设这8个点为:
源点四个坐标分别为A:(x0,y0),(x1,y1),(x2,y2),(x3,y3)
目标点四个坐标分别为B:(X’0,Y’0),(X’1,Y’1),(X’2,Y’2),(X’3,Y’3)
则带入方程(写成矩阵形式)得:
首先,我们假设变换好的图像为new_image 大小跟原图image一样大,然后我们遍历图像new_image行和列,即遍历new_image的每一个像素坐标(Y,X,1),然后利用变换矩阵warpMatrix计算该坐标在原图中的对应位置(y,x,1),将原图中该位置的像素值p(y,x,1)赋值到变换后的图new_image中的(Y,X,1)位置。超出原图像素坐标的点可以随意赋值,看个人喜欢。一般赋值为边缘像素值
二、求(y,x,1)坐标方法
2、矩阵运算法
原图:
原图像的四个点
src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
对应变换后的四个点
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
变换矩阵
[[ 8.92263779e-01 3.76733596e-01 -2.41585375e+02]
[-4.08140258e-01 9.44205073e-01 -5.80899328e+01]
[-8.53836442e-05 5.16464182e-05 1.00000000e+00]]
变换后的图
求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形。
因此,给定透视变换对应的四对像素点坐标,即可求得透视变换矩阵;反之,给定透视变换矩阵,即可对图像或像素点坐标完成透视变换,如下图所示: