欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV_Python API 官方文档学习_ cv2 图像几何变换

程序员文章站 2023-12-26 12:45:15
...

官方官方文档

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)
平移Translation 

      翻译是对象位置的转移。如果您知道需要移动后的坐标(x,y),设为(tx,ty),则可以创建转换矩阵f{M},如下所示:

OpenCV_Python API 官方文档学习_ cv2 图像几何变换
      可以将其转换为np.float32类型的Numpy数组,并将其传递给cv2.warpAffine()函数。请参见下面的例子:

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_Python API 官方文档学习_ cv2 图像几何变换

      OpenCV提供了可调节旋转中心的缩放旋转,这样你可以在任何你喜欢的位置旋转。修正的变换矩阵是由一下矩阵完成。

角θ的旋转是通过形式的变换矩阵来实现的

OpenCV_Python API 官方文档学习_ cv2 图像几何变换

OpenCV_Python API 官方文档学习_ cv2 图像几何变换

      为了找到这个转换矩阵,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))
OpenCV_Python API 官方文档学习_ cv2 图像几何变换


仿射变换(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()

OpenCV_Python API 官方文档学习_ cv2 图像几何变换

透视变换(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()

OpenCV_Python API 官方文档学习_ cv2 图像几何变换


相关标签: OpenCV Python

上一篇:

下一篇: