OpenCV竟然可以这样学!成神之路终将不远(十)

简介: OpenCV竟然可以这样学!成神之路终将不远(十)

 返回目录

目录

10 图像的几何变换

10.1 目标

10.2 变换

10.2.1 缩放

10.2.2 平移

10.2.3 旋转

10.2.4 仿射变换

10.2.5 透视变换


10 图像的几何变换

10.1 目标

    • 学习将不同的几何变换应用到图像上,如平移、旋转、仿射变换等。
    • 你会看到这些函数: cv.getPerspectiveTransform

    10.2 变换

    OpenCV提供了两个转换函数cv.warpAffinecv.warpPerspective,您可以使用它们进行各

    种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输

    入。

    10.2.1 缩放

    缩放只是调整图像的大小。为此,OpenCV带有一个函数cv.resize()。图像的大小可以手动指定,也可以指定缩放比例。也可使用不同的插值方法。首选的插值方法是cv.INTER_AREA用于缩小,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于缩放。默认情况下,出于所有调整大小的目的,使用的插值方法为cv.INTER_LINEAR。您可以使用以下方法调整输入图像的大小:

    import cv2 as cv
    img = cv.imread('../girl6/25.jpg')
    res1 = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)
    # 或者
    height, width, channel = img.shape
    res2 = cv.resize(img, (2 * width, 2 * height), interpolation=cv.INTER_CUBIC)
    cv.imshow('img', img)
    cv.imshow('res1', res1)
    cv.imshow('res2', res2)
    cv.waitKey(0)
    cv.destroyAllWindows()

    image.gif

    可以看到res1和res2两种方法都将图像放到2倍。

    网络异常,图片无法展示
    |
    image.gif 编辑

    10.2.2 平移

    平移是物体位置的移动。如果您知道在方向上的位移,则将其设为,你可以创建转换矩阵,如下所示:

    您可以将其放入np.float32类型的Numpy数组中,并将其传递给cv.warpAffine函数。参见下

    面偏移为(100, 50)的示例:

    import numpy as np
    import cv2 as cv
    img = cv.imread('../girl6/24.jpg')
    rows, cols, channel = img.shape
    M = np.float32([[1, 0, 100], [0, 1, 50]])
    res = cv.warpAffine(img, M, (rows, cols))
    cv.imshow('img', img)
    cv.imshow('res', res)
    cv.waitKey(0)
    cv.destroyAllWindows()

    image.gif

    警告:cv.warpAffine函数的第三个参数是输出图像的大小,其形式应为(width,height) 。记住width =列数, height =行数。

    你将看到下面的结果:

    image.gif编辑

    10.2.3 旋转

    图像旋转角度为θ是通过以下形式的变换矩阵实现的:

    但是OpenCV提供了可缩放的旋转以及可调整的旋转中心,因此您可以在自己喜欢的任何位置旋转。修改后的变换矩阵为:

    其中:

    为了找到此转换矩阵,OpenCV提供了一个函数cv.getRotationMatrix2D。请检查以下示例,该示例将图像相对于中心旋转90度而没有任何缩放比例。

    import cv2 as cv
    img = cv.imread('../girl6/25.jpg')
    rows, cols = img.shape[:2]
    # cols-1 和 rows-1是坐标限制
    M = cv.getRotationMatrix2D(((cols - 1) / 2., (rows - 1) / 2), 90, 1)
    dst = cv.warpAffine(img, M, (cols, rows))
    cv.imshow('img', img)
    cv.imshow('dst', dst)
    cv.waitKey(0)
    cv.destroyAllWindows()

    image.gif

    运行结果如下:

    image.gif编辑

    10.2.4 仿射变换

    在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine

    查看以下示例,并查看我选择的点(以绿色标记):

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    img = cv2.imread('../girl6/20.jpg')
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    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, (width, height))
    plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Input')
    plt.subplot(122), plt.imshow(dst, 'gray'), plt.title('Output')
    plt.show()

    image.gif

    运行结果如下:

    image.gif编辑

    10.2.5 透视变换

    对于透视变换,您需要3x3变换矩阵。即使在转换后,直线也将保持直线。要找到此变换矩阵,您需要在输入图像上有4个点,在输出图像上需要相应的点。在这四个点中,其中三个不应共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵。

    代码如下:

    import cv2 as cv
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv.imread('../girl6/20.jpg')
    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 = cv.getPerspectiveTransform(pts1, pts2)
    dst = cv.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()

    image.gif

    运行结果如下:

    image.gif编辑


    欢迎评论区留言,一起探讨OpenCV成神之路的奥秘。

    顺便给我加个关注,点个赞,加个收藏,让我们一起登上神坛。

    image.gif编辑

    相关文章
    |
    9月前
    |
    机器学习/深度学习 编解码 计算机视觉
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    |
    9月前
    |
    算法 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    |
    9月前
    |
    算法 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    |
    9月前
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十四)
    OpenCV竟然可以这样学!成神之路终将不远(二十四)
    |
    9月前
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    |
    9月前
    |
    计算机视觉 索引 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    |
    9月前
    |
    安全 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    |
    9月前
    |
    文字识别 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    |
    9月前
    |
    定位技术 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    |
    9月前
    |
    算法 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(十八)
    OpenCV竟然可以这样学!成神之路终将不远(十八)