如何在 OpenCV Python 中对图像应用仿射变换?


在仿射变换中,原始图像中所有平行线在输出图像中仍然平行。要对图像应用仿射变换,我们需要输入图像上的三个点和输出图像上对应的三个点。因此,首先,我们定义这些点并传递给函数cv2.getAffineTransform()。它将创建一个 2×3 矩阵,我们称之为变换矩阵 M。

我们可以使用以下语法找到变换矩阵 M:

M = cv2.getAffineTransform(pts1,pts2)

其中pts1是输入图像上三个点的数组,pts2是输出图像上对应三个点的数组。变换矩阵M是类型为np.float64的 NumPy 数组。

我们将M作为参数传递给cv2.warpAffine()函数。请参阅下面给出的语法

cv2.warpAffine(img,M,(cols,rows))

其中,

  • img - 要进行仿射变换的图像。

  • M - 上述定义的仿射变换矩阵。

  • (cols, rows) - 仿射变换后图像的宽度和高度。

步骤

要执行图像仿射变换,您可以按照以下步骤操作:

导入所需的库。在以下所有 Python 示例中,所需的 Python 库是OpenCV。确保您已安装它。

import cv2

使用cv2.imread()函数读取输入图像。传递输入图像的完整路径。

img = cv2.imread('lines.jpg')

定义pts1pts2。我们需要输入图像中的三个点及其在输出图像中的对应位置。

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

使用cv2.getAffineTransform(pts1, pts2)函数计算仿射变换矩阵M

M = cv2.getAffineTransform(pts1, pts2)

使用cv2.warpAffine()方法变换图像。cols 和 rows 是变换后图像所需的宽度和高度。

dst = cv2.warpAffine(img,M,(cols,rows))

显示仿射变换后的图像。

cv2.imshow("Affine Transform", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

让我们看一些示例,以清楚地了解如何在图像上应用仿射变换

输入图像

我们将在下面的示例中使用以下图像作为输入文件:

示例 1

在这个程序中,我们将看到如何对输入图像执行仿射变换。

# import required libraries import cv2 import numpy as np # read the input image img = cv2.imread('lines.jpg') # access the image height and width rows,cols,_ = img.shape # define at three point on input image pts1 = np.float32([[50,50],[200,50],[50,200]]) # define three points corresponding location to output image pts2 = np.float32([[10,100],[200,50],[100,250]]) # get the affine transformation Matrix M = cv2.getAffineTransform(pts1,pts2) # apply affine transformation on the input image dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow("Affine Transform", dst) cv2.waitKey(0) cv2.destroyAllWindows()

输出

以上 Python 程序将生成以下输出窗口:

示例 2

在这个 Python 程序中,我们加载一个灰度图像,定义对应于输入和输出图像的两个点,获取变换矩阵,最后应用warpAffine()方法对输入图像执行仿射变换。

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('lines.jpg', 0) rows,cols = img.shape pts1 = np.float32([[150,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[10,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows)) plt.subplot(121), plt.imshow(img, cmap='gray' ), plt.title('Input') plt.subplot(122), plt.imshow(dst, cmap='gray'), plt.title('Output') plt.show()

输出

执行后,它将生成以下输出窗口:

更新于: 2022年9月27日

4K+ 阅读量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告