OpenCV_Python API 官方文档学习_ cv2 图像几何变换
官方官方文档
Goals
- Learn to apply different geometric transformation to images like translation, rotation, affine transformation etc.
- You will see these functions: cv2.getPerspectiveTransform
实现目标:
1. 学习如何将不同的几何变换应用于平移、旋转、映射变换等。
2. 学习函数 cv2.getPerspectiveTransform。
变换
OpenCV提供了两个转换函数, cv2.warpAffine 和 cv2.warpPerspective,可以使用它们进行各种转换。cv2.warpAffine采用2x3转换矩阵,cv2.warpPerspective则以3x3转换矩阵作为输入。
缩放 (scaling)
缩放只是调整图像的大小。OpenCV附带了一个函数 cv2.resize() 。图像的大小可以手动指定,也可以指定缩放因子。它们可以选择不同的插值方法。较好的插值方法有:cv2.INTER_AREA 表示收缩,cv2.INTER_CUBIC、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),则可以创建转换矩阵f{M},如下所示:
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()
提示:
cv2.warpAffine() 函数的第三个参数是输出图像的大小,它应该以(宽度、高度)的形式出现。宽度=列数、高度=行数。
旋转 (Rotation)
角θ的旋转是通过形式的变换矩阵来实现的。
OpenCV提供了可调节旋转中心的缩放旋转,这样你可以在任何你喜欢的位置旋转。修正的变换矩阵是由一下矩阵完成。
为了找到这个转换矩阵,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))
仿射变换(Affine Transformation)
在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要三个点从输入图像及其对应的位置在输出图像中。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()
透视变换(Perspective Transformation)
对于透视转换,需要一个3x3转换矩阵。即使经过变形,直线仍将保持直线。要找到这个转换矩阵,您需要输入图像上的4个点和输出图像上相应的点。在这4点中,有3点不应是共线的。然后由函数 cv2.getPerspectiveTransform找到转换矩阵。然后用这个3x3变换矩阵应用 cv2.warpPerspective。
看下面代码:
img = cv2.imread('sudokusmall.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')
plt.show()