美文网首页OpenCV
OpenCV-Python教程:12.图片的几何转换

OpenCV-Python教程:12.图片的几何转换

作者: xxxss | 来源:发表于2017-06-15 14:13 被阅读206次

    转换

    OpenCV提供了两个转换函数,cv2.warpAffine和cv2.warpPerspective,通过他们你可以进行各种转换,cv2.warpAffine接受2x3的转换矩阵二cv2.warpPerspective接受3x3的转换矩阵做为输入。

    缩放

    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),你可以创建转换矩阵M:

    你可以把它变成Numpy的数组,类型是np.float32的,然后把它传给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()

    警告:
    cv2.warpAffine()函数的第三个参数是输出图片的大小,应该是(width, height)的形式,记住width=列数,height=行数

    旋转

    对一个图片旋转一个θ角是通过下面这个形式的转换矩阵实现的:

    但是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))

    结果:

    仿射变换


    在仿射变换里,所有原始图片里的平行线在输出的图片里仍然平行,要找到转换矩阵,我们需要输入图片的三个点,和他们在输出图片里的对应位置,然后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个点,以及输出图片上对应的点。在这四个点中,3个不能同线。然后cv2.getPerspectiveTransform函数就能得到转换矩阵了,再用cv2.warpPerspective来接收这个3x3的转换矩阵。

    代码:

    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()

    END

    相关文章

      网友评论

        本文标题:OpenCV-Python教程:12.图片的几何转换

        本文链接:https://www.haomeiwen.com/subject/bscqjttx.html