图像处理的仿射变换和透视变换

图像处理的仿射变换和透视变换

其实一直也没理解“仿射”俩字是啥意思,但是大家都这么叫,其实仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。如果这么命名的话,其实很显然,这俩是一回事,只不过一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是:

仿射变换:
图像处理的仿射变换和透视变换_第1张图片

透视变换:
图像处理的仿射变换和透视变换_第2张图片

从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。

写个程序求解线性方程组相信不是什么难事。

解出方程组之后,就可以按照上面的方程,找到与结果图像上对应的源像素点。然后做插值。

看一下效果啊:

原图:
图像处理的仿射变换和透视变换_第3张图片

仿射变换之后:
图像处理的仿射变换和透视变换_第4张图片

透视变换之后:
图像处理的仿射变换和透视变换_第5张图片

从上图也能看出来区别,仿射变换之后还是平行四边形,透视变换之后就只剩下四边形了。图像的旋转缩放理论上都能用仿射变换来实现(90度、180度、270度的旋转用仿射变换实现不划算)。透视变换的用途可能更多一些,比如:
你扫到的二维码是这样的:
图像处理的仿射变换和透视变换_第6张图片
这样你直接读二维码信息肯定不行,所以需要透视变换一下,成这样:
图像处理的仿射变换和透视变换_第7张图片
就可以读出信息了。

刚才讲,求解仿射变换需要3组对应的点,求解透视变换需要4组对应的点,如果找到的映射点的数量少于3组或4组就肯定解不出来,但是如果多于3组或4组怎么办?那就要最小二乘法做拟合,找到一个最佳变换方程。这个不细说了。

你可能感兴趣的:(算法,图像处理)