1.理论基础
常用图像的变换模型有刚体变换、仿射变换和投影变换等。
(1)刚体变换
如果一幅图像中的两点间的距离经变换后映射到另一幅图像中仍然保持不变,则这种变换称为刚体变换。刚体变换仅局限于平移、旋转和反转(镜像)。在二维空间中,点( x , y )经过刚体变换到点( x , y )的变换公式为:
(4-15)
式中, θ 为旋转角度; 为平移变量。
(2)仿射变换
如果一幅图像中的直线经过变换后映射到另一幅图像上仍为直线,并且保持平行关系,则这种变换称为仿射变换。仿射变换适应于平移、旋转、缩放和反转(镜像)等情况。可以用以下公式表示:
(4-16)
其中 平移量,而参数 a i 则反映了图像旋转、缩放等变化。将这些参数计算出,即可得到两幅图像的坐标变换关系。
(3)投影变换
如果一幅图像中的直线经过变换后映射到另一幅图像上仍为直线,但平行关系基本不保持,则这种变换称为投影变换。二维平面投影变换是关于齐次三维矢量的线性变换,在齐次坐标系下,二维平面上的投影变换具体可用下面的非奇异3×3矩阵形式来描述,即:
(4-17)
则二维投影变换按照式(4-17)将像素坐标点( x , y )映射为像素坐标点( x ′ , y ′ )。
(4-18)
它们的变换参数 m i ( i =0,1,⋯,8) 是依赖于场景和图像的常数。
可见,投影变换是在三维空间内进行的,所以对其进行修正十分困难。如果指定好变换前的4个顶点的坐标,设定其变换后相应的4个顶点的坐标,并设定一个 m 8 的值,通过解方程,就可以求出投影变换矩阵,实现投影变换功能。
2.函数说明
(1)在OpenCV中提供了cv2.getPerspectiveTransform()函数来计算投影变换矩阵。
retval:返回计算得到的变换矩阵;
dst:表示在目标图像上投影得到的四个像素顶点;
src:表示原始图像上指定四个顶点。
注意,这里需要输入4组对应的坐标变换,src和dst均是4×2的二维矩阵,其中每一行代表一个坐标,而且数据类型必须是32位浮点型,否则会报错。
(2)OpenCV提供了cv2.warpPerspective()函数来实现投影变换功能,其一般格式为:
src:表示原始的图像;
M:表示投影变换矩阵;
dsize:表示投影后图像的大小;
flags:表示插值方式;
borderMode:表示边界模式;
borderValue:表示边界值。
其使用方法与仿射变换相似,只是输入的变换矩阵变为3行3列的投影变换矩阵。下面通过一个实例实现图像的投影变换。
3.编程代码
4.效果展示
图像的投影变换效果如图4-9所示。左侧为原始图像,右侧为处理后的图像。
图4-9 图像投影变换效果图