如何使用OpenCV Python在图像上应用透视变换?
在透视变换中,直线在变换后仍保持直线不变。要应用透视变换,我们需要一个3×3透视变换矩阵。我们需要输入图像上的四个点和相应输出图像上的四个点。
我们使用 cv2.getPerspectiveTransform() 方法来找到变换矩阵。它的 语法 如下−
M = cv2.getPerspectiveTransform(pts1,pts2)
其中,
- pts1 −输入图像上的四个点和
-
pts2 −相应输出图像上的四个点。
透视变换矩阵M是一个numpy数组。我们将M传递给 cv2.warpAffine() 函数作为参数来计算透视变换。它的 语法 为−
cv2.warpAffine(img,M,(cols,rows))
其中,
- img −待变换的图像。
-
M −定义在上面的透视变换矩阵。
-
(cols,rows) −变换后图像的宽度和高度。
要在图像上应用透视变换,可以按照以下步骤操作−
步骤
导入所需的库。在以下所有Python示例中,所需的Python库是 OpenCV 。请确保您已经安装了它。
import cv2
使用 cv2.imread() 函数读取输入图像。传递输入图像的完整路径。
img = cv2.imread('warning_wall.jpg')
定义 pts1 和 pts2 。pts1是一个数组,在输入图像上有四个点,而pts2是相应输出图像上有四个点的数组。
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,50],[300,0],[0,300],[300,300]])
使用 cv2.getPerspectiveTransform(pts1, pts2) 函数计算透视变换矩阵M。
M = cv2.getPerspectiveTransform(pts1,pts2)
使用 cv2.warpAffine() 方法转换图像,将透视变换矩阵作为参数传递。cols和rows是变换后图像的所需宽度和高度。
dst = cv2.warpAffine(img,M,(cols,rows))
显示转换后的图像。
cv2.imshow("Transformed Image", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
让我们来看一些示例,以更好地理解如何操作。
我们将使用此图像作为以下示例的 输入文件 。
示例1
在此示例中,我们对输入图像执行透视变换。我们将输出图像的宽度和高度设置为与输入图像相同。
# 导入所需库
import cv2
import numpy as np
# 读取输入图像
img = cv2.imread('warning_wall.jpg')
# 找到图像的高度和宽度
# 宽度 = 列数,高度 = 图像数组中的行数
rows,cols,ch = img.shape
# 定义输入图像上的四个点
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
# 定义输出图像上对应的四个点
pts2 = np.float32([[100,50],[300,0],[0,300],[300,300]])
# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(pts1,pts2)
# 使用透视变换矩阵对图像进行变换
dst = cv2.warpPerspective(img,M,(cols, rows))
# 显示变换后的图像
cv2.imshow('Transformed Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果
执行该Python程序将显示以下输出窗口−
上述输出图像是在输入图像进行透视变换后获得的。
示例2
在此示例中,我们对输入图像进行透视变换。我们将输出图像的宽度和高度设置为(600,350)。其与输入图像的宽度和高度不同。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('warning_wall.jpg',0)
rows,cols = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(600,350))
plt.subplot(121),plt.imshow(img, cmap='gray'),plt.title('输入')
plt.subplot(122),plt.imshow(dst, cmap='gray'),plt.title('输出')
plt.show()
输出
在执行时,它将生成以下输出窗口 −
左侧的图像是输入图像,右侧的图像是透视变换后的输出图像。