如何在OpenCV Python中应用仿射变换来处理图像?

如何在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()

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

输入图像

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

如何在OpenCV Python中应用仿射变换来处理图像?

示例1

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

# 导入所需的库
import cv2
import numpy as np

# 读取输入图像
img = cv2.imread('lines.jpg')

# 访问图像的高度和宽度
rows, cols, _ = img.shape

# 在输入图像上定义三个点
pts1 = np.float32([[50,50],[200,50],[50,200]])

# 定义三个点对应于输出图像的位置
pts2 = np.float32([[10,100],[200,50],[100,250]])

# 获取仿射变换矩阵
M = cv2.getAffineTransform(pts1,pts2)

# 在输入图像上应用仿射变换
dst = cv2.warpAffine(img, M,(cols,rows))
cv2.imshow("Affine Transform", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

上述Python程序将产生以下输出窗口 –

如何在OpenCV 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('输入')
plt.subplot(122), plt.imshow(dst, cmap='gray'), plt.title('输出')
plt.show()

输出

在执行时会产生以下输出窗口 −

如何在OpenCV Python中应用仿射变换来处理图像?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程