如何在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')
定义 pts1 和 pts2 。我们需要三个来自输入图像的点及其在输出图像中的相应位置。
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 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程序将产生以下输出窗口 –
例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()
输出
在执行时会产生以下输出窗口 −