zoukankan      html  css  js  c++  java
  • 【python-opencv】图像几何变换

    1、变换

    OpenCV提供了两个转换函数cv.warpAffinecv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。

    import cv2 as cv
    from google.colab.patches import cv2_imshow
    image=cv.imread('变换.jpg')
    # 得到图片的高和宽
    height,width=image.shape[:2]
    # 定义对应的点
    points1 = np.float32([[75,55], [340,55], [33,435], [400,433]])
    points2 = np.float32([[0,0], [360,0], [0,420], [360,420]])
    # 计算得到转换矩阵
    M = cv.getPerspectiveTransform(points1, points2)
    # 实现透视变换转换
    processed = cv.warpPerspective(image,M,(360, 420))
    cv2_imshow(processed)

    结果:

    参考:https://zhuanlan.zhihu.com/p/37023649

    2、缩放

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

    import numpy as np
    import cv2 as cv
    img = cv.imread('messi5.jpg')
    res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
    #或者
    height, width = img.shape[:2]
    res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

    结果:

    3、平移

    平移是对象位置的转换。 如果你知道(x,y)方向的偏移,让它为(tx,ty),你可以创建变换矩阵M,如下所示:

    可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.

    import cv2
    import numpy as np
    
    img = cv2.imread('img.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',img)
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    结果:

    4、图像旋转

    通过变换矩阵实现图像旋转角度θ:

    OpenCV提供可调旋转,旋转中心可调,因此可以在任何的位置旋转.修正的变换矩阵由下式给出:

    为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D.

    img = cv.imread('messi5.jpg',0)
    rows,cols = img.shape
    # cols-1 和 rows-1 是坐标限制
    M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
    dst = cv.warpAffine(img,M,(cols,rows))

    结果:

    5、仿射变换

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

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

    img = cv.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 = cv.getAffineTransform(pts1,pts2)
    dst = cv.warpAffine(img,M,(cols,rows))
    plt.subplot(121),plt.imshow(img),plt.title('Input')
    plt.subplot(122),plt.imshow(dst),plt.title('Output')

    结果:

    6、透视变换

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

    请参见下面的代码:

    img = cv.imread('sudoku.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 = 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()

    结果:

    参考:

    http://woshicver.com/FifthSection/4_2_%E5%9B%BE%E5%83%8F%E5%87%A0%E4%BD%95%E5%8F%98%E6%8D%A2/

  • 相关阅读:
    redis配置文件参数说明及命令操作
    在Window 下安装Redis数据库
    eclipse怎样在线安装hibernate tools插件并使用
    eclipse如何优化构建的速度(Building)
    java实现敏感词过滤(DFA算法)
    eclipse编码格式设置
    Jquery Ajax简单封装(集中错误、请求loading处理)
    Vue简单封装axios—解决post请求后端接收不到参数问题
    vue项目实现记住密码功能
    vue路由的两种模式配置以及history模式下面后端如何配置
  • 原文地址:https://www.cnblogs.com/xiximayou/p/13125121.html
Copyright © 2011-2022 走看看