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

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


      可以将其转换为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提供了可调节旋转中心的缩放旋转,这样你可以在任何你喜欢的位置旋转。修正的变换矩阵是由一下矩阵完成。

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


      为了找到这个转换矩阵,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()


阅读更多
文章标签: OpenCV Python
个人分类: OpenCV
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭