目标

学习将不同的几何变换应用于像翻译,旋转,仿射变换等图像。

您将看到这些函数:cv2.getPerspectiveTransform

转换

OpenCV提供了两个转换函数cv2.warpAffine和cv2.warpPerspective,您可以使用它们进行各种转换。

cv2.warpAffine需要一个2x3变换矩阵,而cv2.warpPerspective则需要一个3x3的变换矩阵作为输入。

缩放

缩放只是调整图像大小。

为此,OpenCV带有一个函数cv2.resize()。

可以手动指定图像的大小,也可以指定缩放因子。

使用不同的插值方法。

优选的插值方法是缩小的cv2.INTER_AREA和用于缩放的cv2.INTER_CUBIC(slow)&cv2.INTER_LINEAR。

默认情况下,使用的插值方法是cv2.INTER_LINEAR,用于所有调整大小的目的。

您可以使用以下方法之一调整输入图像的大小:

import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#OR
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

平移

平移是物体位置的移动。如果您知道(x,y)方向的移动,则将其设为(tx,ty),则可以如下创建变换矩阵M:

您可以将其变成np.float32类型的Numpy数组,并将其传递给cv2.warpAffine()函数。

看下面的例子(100,50):

import cv2
import numpy as np
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

旋转

OpenCV提供了一个函数cv2.getRotationMatrix2D。

检查下面的示例,它将图像相对于中心旋转了90度,没有任何缩放。

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。

为了找到转换矩阵,我们需要输入图像中的三个点和输出图像中相应的位置。

然后cv2.getAffineTransform将创建一个2x3矩阵,传递给cv2.warpAffine。

img = cv2.imread('drawing.png')
rows,cols,ch = 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))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

透视转换

对于透视变换,您需要一个3x3变换矩阵。

即使转型后,直线也保持直线。

要找到此转换矩阵,您需要输入图像上的4点和输出图像上的对应点。

在这4个点中,其中3个不应该共线。

那么转换矩阵可以通过函数cv2.getPerspectiveTransform找到。

然后用这个3x3转换矩阵应用cv2.warpPerspective。


img = cv2.imread('sudoku.png')
rows,cols,ch = 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,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

results matching ""

    No results matching ""