如何使用OpenCV Python在图像上应用透视变换?

如何使用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')

定义 pts1pts2 。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()

让我们来看一些示例,以更好地理解如何操作。

我们将使用此图像作为以下示例的 输入文件

如何使用OpenCV Python在图像上应用透视变换?

示例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程序将显示以下输出窗口−

上述输出图像是在输入图像进行透视变换后获得的。

如何使用OpenCV 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()

输出

在执行时,它将生成以下输出窗口 −

如何使用OpenCV Python在图像上应用透视变换?

左侧的图像是输入图像,右侧的图像是透视变换后的输出图像。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程