引用 在路上 的博文 https://blog.csdn.net/qq_29462849/article/details/80728757
单应性变换
如下图所示的平面的两幅图像。红点表示两幅图像中的相同物理点,我们称之为对应点。这里显示了四种不同颜色的四个对应点 - 红色,绿色,黄色和橙色。 一个Homography是一个变换(3×3矩阵),将一个图像中的点映射到另一个图像中的对应点。单应性变换其实就是一个平面到另一个平面的变换关系。
仿射变换
仿射变换是一种二维坐标到二维坐标之间的线性变换(相同平面),它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),但是角度会改变。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
透视变换
透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x′,y′)(x′,y′)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相(m11,m12,m13,m21,m22,m23)(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换.
在看看另外一个的解释吧
图像处理的仿射变换和透视变换
其实一直也没理解“仿射”俩字是啥意思,但是大家都这么叫,其实仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。如果这么命名的话,其实很显然,这俩是一回事,只不过一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是:
仿射变换:
透视变换:
从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。
写个程序求解线性方程组相信不是什么难事。
解出方程组之后,就可以按照上面的方程,找到与结果图像上对应的源像素点。然后做插值。
看一下效果啊:
原图:
仿射变换之后:
透视变换之后:
从上图也能看出来区别,仿射变换之后还是平行四边形,透视变换之后就只剩下四边形了形状不规则啊。图像的旋转缩放理论上都能用仿射变换来实现(90度、180度、270度的旋转用仿射变换实现不划算)。透视变换的用途可能更多一些,比如:
你扫到的二维码是这样的:
这样你直接读二维码信息肯定不行,所以需要透视变换一下,成这样:
就可以读出信息了。
刚才讲,求解仿射变换需要3组对应的点,求解透视变换需要4组对应的点,如果找到的映射点的数量少于3组或4组就肯定解不出来,但是如果多于3组或4组怎么办?那就要最小二乘法做拟合,找到一个最佳变换方程。这个不细说了。