Skip to content

图像变换

图像的放大与缩小

  • 图像缩放

    • resize(src, dst, dsize, fx, fy, interpolation)
      • src: 源
      • sdt: 目的 缩放完的输出结果
      • dsize: 目标的大小,比如目前是640x360,需要放大到1280x720,此处写入1280*720即可
      • fx: x轴的缩放因子
      • fy: y轴的缩放因子
        • dsize与fx fy冲突,存在一种即可
      • interpolation: 插值算法,缩放时的算法
        1. INTER_NEAREST: 邻近插值,速度快,效果差。
        2. INTER_LINEAR: 双线性插值,原图中的4个点(该算法是默认算法)。
        3. INTER_CUBIC: 三次插值,原图中的16个点。
        4. INTER_AREA: 效果最好,根据一片区域进行计算。
    import cv2
    
    dog = cv2.imread('./dog.jpeg')
    # dsize(x, y)
    new = cv2.resize(dog, None, fx=0.9, fy=0.9, interpolation=cv2.INTER_AREA)
    
    cv2.imshow('dog', dog)
    cv2.imshow('new', new)
    cv2.waitKey(0)
    

    Image title
    结果

图像的翻转

  • flip(img, flipCode)

    • flipCode == 0: 上下翻转
    • flipCode > 0: 左右翻转
    • flipCode < 0: 上下 + 左右翻转
    import cv2
    
    dog = cv2.imread('./dog.jpeg')
    new1 = cv2.flip(dog, 0)
    new2 = cv2.flip(dog, 1)
    new3 = cv2.flip(dog, -1)
    
    cv2.imshow('dog', dog)
    cv2.imshow('new1', new1)
    cv2.imshow('new2', new2)
    cv2.imshow('new3', new3)
    cv2.waitKey(0)
    

    Image title
    结果

图像的旋转

  • rotate(img, rotateCode)

    • ROTATE_90_CLOCKWISE: 顺时针旋转90度
    • ROTATE_180: 旋转180度
    • ROTATE_90_COUNTERCLOCKWISE: 反向90度 结果270度
    import cv2
    
    cv = cv2.imread('./test.png')
    new = cv2.rotate(cv, cv2.ROTATE_90_CLOCKWISE)
    new1 = cv2.rotate(cv, cv2.ROTATE_180)
    
    cv2.imshow('cv', cv)
    cv2.imshow('new', new)
    cv2.imshow('new1', new1)
    cv2.waitKey(0)
    

    Image title
    结果

图像的仿射变换

  • 仿射变换是图像旋转、缩放、平移的总称
  • warpAffine(src, M, dsize, flags, mode, value)
    • src: 源
    • M: 变换矩阵(如果进行平移,就是2x3的矩阵)
    • dsize: 输出尺寸大小
    • flags: 与resize中的插值算法一致
    • mode: 边界外推发标志
    • value: 填充边界的值

图像的平移(平移矩阵)

  • 矩阵中的每个像素由(x, y)组成
  • 因此,其变换矩阵式2x2的矩阵
  • 平移向量为2x1的向量,所在平移矩阵为2x3矩阵

    import cv2
    import numpy as np
    
    dog = cv2.imread('./dog.jpeg')
    h, w, ch = dog.shape
    M = np.float32([[1, 0, 500], [0, 1, 300]])
    new = cv2.warpAffine(dog, M, (w, h))
    
    cv2.imshow('dog', dog)
    cv2.imshow('new', new)
    cv2.waitKey(0)
    

    Image title
    结果

仿射变换获取变换矩阵

  • getRotationMatrix2D(center, angle, scale) 自动生成

    • center 中心点,图片在旋转的时候是以哪为中心点
    • angle 角度,旋转的角度,是按照逆时针旋转的
    • scale 缩放比例
    import cv2
    import numpy as np
    
    dog = cv2.imread('./dog.jpeg')
    h, w, ch = dog.shape
    
    # 自动生成偏移矩阵方法
    M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
    new = cv2.warpAffine(dog, M, (w, h))
    
    cv2.imshow('dog', dog)
    cv2.imshow('new', new)
    cv2.waitKey(0)
    

    Image title
    结果

仿射变换变换矩阵之二

  • getAffineTransform 通过三个点可以确定变换的位置

    import cv2
    import numpy as np
    
    dog = cv2.imread('./dog.jpeg')
    h, w, ch = dog.shape
    
    src = np.float32([[400, 300], [800, 300], [400, 1000]])
    dst = np.float32([[200, 400], [600, 500], [150, 1100]])
    M = cv2.getAffineTransform(src, dst)
    new = cv2.warpAffine(dog, M, (w, h))
    
    cv2.imshow('dog', dog)
    cv2.imshow('new', new)
    cv2.waitKey(0)
    

    Image title
    结果

OpenCV透视变换

  • warpPerspective(img, M, dsize, ...) 透视变换API
    • img 源
    • M 变换矩阵
    • dsize 目标输出的图像大小
  • getPersectiveTransform(src, dst) 获取透视变换矩阵

    • src 源
    • dst 目的(四个点)
    import cv2
    import numpy as np
    
    img = cv2.imread('perspective.jpeg')
    
    src = np.float32([[100, 1100], [2100, 1100], [0, 4000,], [2500, 3900]])
    dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
    M = cv2.getPerspectiveTransform(src, dst)
    
    new = cv2.warpPerspective(img, M, (2300, 3000))
    
    cv2.imshow('orgin', img)
    cv2.imshow('new', new)
    cv2.waitKey(0)
    cv2.imwrite('./math.png', new)
    

    Image title
    结果