OpenCV学习笔记 - 图像变换(重点)

文章目录

  • 图像变换
    • 基本变换
      • cv2.resize(src,dsize,fx,fy,interpolation)
      • cv2.filp(src,fileCode)
      • cv2.rotate(img,rotateCode)
    • 仿射变换
      • cv2.warpAffine(src,M,dsize,flags,mode,value)
      • cv2.getRotationMatrix2D(center,angle,scale)
      • cv2.getAffineTransform(src,dst)
    • 透视变换
      • cv2.warpPerspective(img,M,dsize)
      • cv2.getPerspectiveTransform(src,dst)

图像变换

基本变换

cv2.resize(src,dsize,fx,fy,interpolation)

  • 代码功能:实现图像缩放变换;
  • 参数说明
    • src: 表示需要缩放的原始图像,通常用一个dst接住
    • dsize: 代表输出图像尺寸
    • fx: 代表水平方向的缩放比例
    • fy: 代表垂直方向的缩放比例
    • interpolation: 插值方式
      OpenCV学习笔记 - 图像变换(重点)_第1张图片
  • 代码实例及其实验效果

    cv2.resize函数有两种对图像进行缩放操作的方式

    • 使用dsize,且fx,fy使用默认参数
    • 使用fx,fy,且dsize=None
    import cv2
    import numpy as np
    
    # 读入图片
    fdu = cv2.imread('./img/fdu.jpg')
    
    # 对原始图像进行缩放操作
    # new_img = cv2.resize(fdu, (360,360))
    new_img = cv2.resize(fdu,None,fx=0.3,fy=0.3,interpolation=cv2.INTER_AREA)
    
    
    # 展示图片
    cv2.imshow('fdu',fdu)
    cv2.imshow('new_img',new_img)
    
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.filp(src,fileCode)

  • 代码功能: 实现图像在水平方向翻转,垂直方向翻转,两个方向同时翻转;
  • 参数说明
    • src: 表示需要翻转的原始图像,通常用一个dst接住
    • filpCode: 代表旋转类型
      在这里插入图片描述
  • 代码示例
    import cv2
    import numpy as np
    
    # 加载图像
    fdu = cv2.imread('./img/fdu.jpg')
    
    # 实现图像翻转操作 -- 上下翻转
    new_img = cv2.flip(fdu,0)
    # 实现图像翻转操作 -- 左右翻转
    new_img1 = cv2.flip(fdu,1)
    # 实现图像翻转操作 -- 上下+左右翻转
    new_img2 = cv2.flip(fdu,-1)
    
    # 显示图像
    cv2.imshow('fdu',fdu)
    cv2.imshow('new_img',new_img)
    cv2.imshow('new_img1',new_img1)
    cv2.imshow('new_img2',new_img2)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.rotate(img,rotateCode)

  • 代码功能:实现指定图像角度以及规定方向旋转

  • 参数说明

    • img
    • rotateCode
      • cv2.ROTATE_90_CLOCKWISE:顺时针旋转90°
      • cv2.ROTATE_180:旋转180°
      • cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转90°
  • 代码实例

    import cv2
    import numpy as np
    
    # 读取图片
    fdu = cv2.imread('./img/fdu.jpg')
    
    # 对图片实现旋转操作
    new_img = cv2.rotate(fdu,cv2.ROTATE_90_CLOCKWISE)
    
    # 展示图片
    cv2.imshow('fdu',fdu)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

仿射变换

cv2.warpAffine(src,M,dsize,flags,mode,value)

  • 代码功能:实现图像的仿射变换;(图像旋转,缩放,平移的总称);其通过一个变换矩阵 M M M 实现变换;
  • 参数说明
    • src:表示需要进行仿射变换的图像
    • M:是一个 2 × 3 2×3 2×3 的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换
    • dsize:输出图像的尺寸
    • flags:本质上就是插值方式通常选取默认的方式
    • borderMode:代表边类型,默认为 BORDER_CONSTANT;若取值为 BORDER_TRANSPARENT 时,意味着目标图像内的值不做改变,这些值对应原始图像的异常值
    • borderValue:代表边界值,默认是0
  • 代码实例
    # 加载原始图像
    img = cv2.imread('./img/fdu.jpg')
    
    # 图像简单的平移
    new_img = cv2.warpAffine(img,np.float32([[1,0,10],[0,1,20]]),(img.shape[1],img.shape[0]))
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.getRotationMatrix2D(center,angle,scale)

  • 代码功能:获取变换矩阵,根据此变换矩阵对图像进行仿射变换
  • 参数说明
    • center:表示旋转的中心点
    • angle:表示旋转角度,正数则表示逆时针旋转,负数则表示顺时针旋转
    • scale:缩放比例
  • 代码实例
    # 加载图片
    img = cv2.imread('./img/fdu.jpg')
    height,width,channel = img.shape
    
    # 旋转放缩,设置旋转放缩的角度,以及放缩的幅度,进而生成变换矩阵
    M = cv2.getRotationMatrix2D((width/2,height/2),45,0.5)
    
    # 实现图像的仿射变换
    new_img = cv2.warpAffine(img,M,(width,height))
    
    # 显示图片
    cv2.imshow('img', img)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.getAffineTransform(src,dst)

  • 代码功能:通过变换前后的两个平行四边形的左上角,右上角,左下角三个点计算出变换矩阵
  • 参数说明
    • src:表示输入图像的三个点坐标(矩形的左上角,右上角,左下角)
    • dst:表示输出图像的三个点坐标(平行四边形的左上角,右上角,左下角)
  • 代码实例
    # 加载图片
    img = cv2.imread('./img/fdu.jpg')
    
    # 设置想变换的角度
    ## 在原始图像位置中任意找三个点,这三个点分别构成矩形的左上角,右上角,左下角
    src = np.float32([[50,50],[200,50],[20,200]])
    
    ## 在目标图像位置中任意找三个点,这三个点分别构成矩形的左上角,右上角,左下角
    dst = np.float32([[50,100],[200,50],[100,250]])
    
    
    # 计算变换矩阵
    M = cv2.getAffineTransform(src,dst)
    
    # 将图片进行仿射变换
    new_img = cv2.warpAffine(img,M,(img.shape[1],img.shape[0]))
    
    # 展示图片
    cv2.imshow('img', img)
    cv2.imshow('new_img', new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

透视变换

cv2.warpPerspective(img,M,dsize)

  • 代码功能:将图像进行透视变换
  • 参数说明
    • img:需要进行透视变换的图像
    • M:变换矩阵
    • dsize:输出图像的大小

cv2.getPerspectiveTransform(src,dst)

  • 代码功能:通过变换前后的两个平行四边形的左上角,右上角,左下角四个顶点计算出变换矩阵
  • 参数说明
    • src:表示输入图像的四个点坐标
    • dst:表示输出图像的四个点坐标
  • 代码实例
    说明:透视变换有一个非常广泛地应用就是将拍摄有偏差的图像进行校正,下面我们以一个例子来熟悉opencv库中透视变换的API如何运用;这一环节博主在学习时候一直卡壳在如何计算四个点上,今天我就把这一个过程分享给大家;
    • 我们需要将我们需要校正的图像加载在画图中记录校正图像的四个顶点的坐标
      OpenCV学习笔记 - 图像变换(重点)_第2张图片

    • 粗略计算本子的长和宽并设置输出图片的长度为本子的宽和长;

      # 原始图像的尺寸(宽,高)(167,338), (942,12), (374,881), (1198,522)四个点坐标
      img_size = (840,1048)
      
    • 计算变换矩阵

      # 选取透视变换前后的四个角度并计算变换矩阵
      src = np.float32([[167,338], [942,12], [374,881], [1198,522]])
      dst = np.float32([[0,img_size[1]],[0, 0],[img_size[0], img_size[1]],[img_size[0], 0]])
      M = cv2.getPerspectiveTransform(src,dst)
      
    • 对图像进行透视变换并将图像进行展示

      # 实现图片的透视变换
      new_img = cv2.warpPerspective(img,M,img_size)
      
      # 展示图片
      cv2.imshow('img',img)
      cv2.imshow('new_img',new_img)
      key = cv2.waitKey(0)
      if key & 0xFF == ord('q'):
          cv2.destroyAllWindows()
      
    • 显示图片
      OpenCV学习笔记 - 图像变换(重点)_第3张图片

你可能感兴趣的:(Computer,Vison,opencv,计算机视觉,学习)