Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm
5.3节所讲的仿射变换可以将矩形映射为任意平行四边形,透视变换则可以将任意四边形映射为矩形。
透视变换通过函数cv2.warpPerspective()实现,该函数的语法是:
dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] )
式中:
● dst代表透视处理后的输出图像,该图像和原始图像具有相同的类型。dsize决定输出图像的实际大小。
● src代表要透视的图像。
● M代表一个3×3的变换矩阵。
● dsize代表输出图像的尺寸大小。
● flags代表插值方法,默认为INTER_LINEAR。当该值为WARP_INVERSE_MAP时,意味着M是逆变换类型,能实现从目标图像dst到原始图像src的逆变换。具体可选值参见表5-1。
● borderMode代表边类型,默认为BORDER_CONSTANT。当该值为BORDER_TRANSPARENT时,意味着目标图像内的值不做改变,这些值对应原始图像内的异常值。
● borderValue代表边界值,默认是0。
与仿射变换一样,同样可以使用一个函数来生成函数cv2.warpPerspective()所使用的转换矩阵。该函数是cv2.getPerspectiveTransform(),其语法格式为:
retval = cv2.getPerspectiveTransform( src, dst )
式中:
● src代表输入图像的四个顶点的坐标。
● dst代表输出图像的四个顶点的坐标。
需要注意的是,src参数和dst参数是包含四个点的数组,与仿射变换函数cv2.getAffineTransform()中的三个点是不同的。实际使用中,我们可以根据需要控制src中的四个点映射到dst中的四个点。
eg1:设计程序,完成图像透视。
根据题目要求,设计程序如下:
import cv2
import numpy as np
img=cv2.imread('demo.bmp')
rows,cols=img.shape[:2]
print(rows,cols)
pts1 = np.float32([[150,50],[400,50],[60,450],[310,450]])
pts2 = np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(cols,rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,指定原始图像中平行四边形的四个顶点pts1,指定目标图像中矩形的四个顶点pts2,使用M=cv2.getPerspectiveTransform(pts1, pts2)生成转换矩阵M。接下来,使用语句dst=cv2.warpPerspective(img, M, (cols, rows))完成从平行四边形到矩形的转换。
运行程序,出现如图5-6所示的运行结果。其中,左图是原始图像,是一个平行四边形(内含多个小平行四边形);右图是透视结果图像,是一个矩形(内含多个小矩形)。