使用Python进行图像几何变换的操作流程

作者:

文章目录
  • # cv2.addWeighted() 是 OpenCV 中最重要和最常用的图像处理函数之一,用于实现图像的加权混合(也称为alpha混合)。 # dst = src1 × alpha + src2 × beta + gamma dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) 参数 类型 描述 默认值 重要说明 src1 numpy.ndarray 第一个输入图像(矩阵) 必填 支持多通道图像(如BGR彩色 图) alpha float 第一个图像的权重系数 必填 通常范围0.0-1.0,但可为任意实数 src2 numpy.ndarray 第二个输入图像(矩阵) 必填 必须与src1尺寸和通道数相同 beta float 第二个图像的权重系数 必填 通常alpha + beta = 1.0 gamma float 添加到加权和的标量值 必填 用于亮度调整,通常为0 dst numpy.ndarray 输出图像 None 可选,用于预分配输出数组 dtype int 输出数组的深度 -1 可选,如cv2.CV_8U, cv2.CV_32F import cv2 # 读取两张相同尺寸的图像 img1 = cv2.imread(“image1.jpg”) # 替换为你的图片路径 img2 = cv2.imread(“image2.jpg”) # 替换为你的图片路径 # 检查图像是否成功读取 if img1 is None or img2 is None: print(“错误:无法读取图像文件”) exit() # 调整img2尺寸匹配img1 if img1.shape != img2.shape: img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0])) # 注意宽高顺序 # 图像混合 result = cv2.addWeighted(img1, 0.3, img2, 0.7, 0) # 显示结果 cv2.imshow(“Image Mixing”, result) cv2.waitKey(0) cv2.destroyAllWindows()
  • 目录
    • 算数操作
      • 图像的加法
      • OpenCV加法 
      • Numpy加法 
    • 图像的混合
      • 几何变换
        • 图像缩放
        • 图像平移
        • 图像旋转
        • 仿射变换
        • 透射变换
        • 图像金字塔

      OpenCV加法是饱和操作,Numpy加法是模运算。

      import cv2
      import numpy as np
       
      x = np.uint8([250])
      y = np.uint8([10])
      print(x)  # [[250]]
      print(y)  # [[10]]
      print(cv2.add(x, y))  # [[255]]
      print(x + y)  # [4]

      # cv2.add() 是 OpenCV 中用于执行图像加法运算的核心函数,与 Python 的普通加法运算符 (+) 不同,它使用饱和运算防止溢出。
      dst = cv2.add(src1, src2[, dst[, mask[, dtype]]])
      参数 类型 描述
      src1 numpy.ndarray 第一个输入数组(图像)
      src2 numpy.ndarray 或 标量 第二个输入数组或标量值
      dst numpy.ndarray (可选) 输出数组(与输入相同大小和类型)
      mask numpy.ndarray (可选) 8位单通道掩码,指定要修改的输出数组元素
      dtype int (可选) 输出数组的深度(如 cv2.CV_8U, cv2.CV_32F)

      中文标题会乱码,干脆使用英文标题了,键盘按下任意键退出,只是关闭窗口程序不会结束。

      import cv2
       
      # 读取两张相同尺寸的图像
      img1 = cv2.imread("image1.jpg")  # 替换为你的图片路径
      img2 = cv2.imread("image2.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img1 is None or img2 is None:
          print("错误:无法读取图像文件")
          exit()
       
      # 调整img2尺寸匹配img1
      if img1.shape != img2.shape:
          img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意宽高顺序
       
      # 直接相加
      result = cv2.add(img1, img2)
       
      # 显示结果
      cv2.imshow("OpenCV Addition", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      很明显直接相加的话图像直接失真了。

      result = img1 + img2
      import cv2
       
      # 读取两张相同尺寸的图像
      img1 = cv2.imread("image1.jpg")  # 替换为你的图片路径
      img2 = cv2.imread("image2.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img1 is None or img2 is None:
          print("错误:无法读取图像文件")
          exit()
       
      # 调整img2尺寸匹配img1
      if img1.shape != img2.shape:
          img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意宽高顺序
       
      # 直接相加
      result = img1 + img2
       
      # 显示结果
      cv2.imshow("Numpy Addition", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      # cv2.addWeighted() 是 OpenCV 中最重要和最常用的图像处理函数之一,用于实现图像的加权混合(也称为alpha混合)。
      # dst = src1 × alpha + src2 × beta + gamma
      dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
      参数 类型 描述 默认值 重要说明
      src1 numpy.ndarray 第一个输入图像(矩阵) 必填 支持多通道图像(如BGR彩色 图)
      alpha float 第一个图像的权重系数 必填 通常范围0.0-1.0,但可为任意实数
      src2 numpy.ndarray 第二个输入图像(矩阵) 必填 必须与src1尺寸和通道数相同
      beta float 第二个图像的权重系数 必填 通常alpha + beta = 1.0
      gamma float 添加到加权和的标量值 必填 用于亮度调整,通常为0
      dst numpy.ndarray 输出图像 None 可选,用于预分配输出数组
      dtype int 输出数组的深度 -1 可选,如cv2.CV_8U, cv2.CV_32F
      import cv2
       
      # 读取两张相同尺寸的图像
      img1 = cv2.imread("image1.jpg")  # 替换为你的图片路径
      img2 = cv2.imread("image2.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img1 is None or img2 is None:
          print("错误:无法读取图像文件")
          exit()
       
      # 调整img2尺寸匹配img1
      if img1.shape != img2.shape:
          img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意宽高顺序
       
      # 图像混合
      result = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)
      # 显示结果
      cv2.imshow("Image Mixing", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      对图像进行放大或缩小。

      resized = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

      参数详解:

      • src: 输入图像 (numpy.ndarray)
      • dsize: 输出图像尺寸 (tuple: (width, height))
      • fx: 水平缩放因子 (float)
      • fy: 垂直缩放因子 (float)
      • interpolation: 插值方法 (默认为 cv2.INTER_LINEAR)

      重要规则:必须指定 dsize 或 (fx, fy),但不能同时指定两者

      插值方法对比

      插值方法 枚举值 时间复杂度 质量 适用场景
      最近邻插值 cv2.INTER_NEAREST O(1) 像素艺术、实时处理
      双线性插值 cv2.INTER_LINEAR O(4) 默认选择,平衡速度质量
      双三次插值 cv2.INTER_CUBIC O(16) 高质量放大,照片处理
      区域插值 cv2.INTER_AREA O(1) 中高 缩小图像首选
      Lanczos插值 cv2.INTER_LANCZOS4 O(64) 极高 专业级放大,医学影像

       绝对尺寸

      resized = cv2.resize(img, (400, 300))

      相对尺寸

      # 缩小为原图的50%
      half_size = cv2.resize(img, None, fx=0.5, fy=0.5)

      指定平移矩阵后,调用cv.warpAffine()平移图像。

      dst = cv2.warpAffine(
          src, 
          M, 
          dsize, 
          dst=None, 
          flags=cv2.INTER_LINEAR, 
          borderMode=cv2.BORDER_CONSTANT, 
          borderValue=0
      )

      必需参数

      参数 类型 描述
      src numpy.ndarray 输入图像 (单通道或多通道)
      M numpy.ndarray (2×3) 2×3仿射变换矩阵
      dsize tuple 输出图像尺寸 (width, height)

      可选参数

      参数 类型 默认值 描述
      dst numpy.ndarray None 输出图像数组 (预分配内存)
      flags int cv2.INTER_LINEAR 插值方法
      borderMode int cv2.BORDER_CONSTANT 边界填充模式
      borderValue scalar 0 边界填充值 (BORDER_CONSTANT时使用)

       M仿射变换矩阵

      M = [ a11  a12  b1 ]
          [ a21  a22  b2 ]

      变换类型与矩阵关系

      变换类型 矩阵公式 说明
      平移 [[1, 0, tx], [0, 1, ty]] tx, ty 为平移量
      旋转 cv2.getRotationMatrix2D(center, angle, scale) 中心点、角度、缩放
      缩放 [[sx, 0, 0], [0, sy, 0]] sx, sy 为缩放因子
      倾斜 [[1, shx, 0], [shy, 1, 0]] shx, shy 为倾斜因子
      组合变换 M = M1 × M2 矩阵乘法组合多个变换
      import cv2
      import numpy as np
       
      # 读取两张相同尺寸的图像
      img = cv2.imread("image1.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img is None:
          print("错误:无法读取图像文件")
          exit()
      # x移动200px,y移动150px
      M = np.float32([[1, 0, 200], [0, 1, 150]])  # 平移矩阵
      result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
       
      # 显示结果
      cv2.imshow("Image Translation", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      调用cv.getRotationMatrix2D获取旋转矩阵,然后调用cv.warpAffine()进行旋转。

      # 生成旋转矩阵
      retval = cv2.getRotationMatrix2D(center, angle, scale)
      参数 类型 描述
      center tuple (x, y) 旋转中心点坐标
      angle float 旋转角度(度),逆时针为正
      scale float 缩放比例 (1.0 = 保持原大小)

      返回值:retval: 2×3 仿射变换矩阵 (numpy.ndarray, dtype=float64)

      此时M:[[  0.70710678   0.70710678 -50.33008589]
                     [ -0.70710678   0.70710678 418.49242405]]

      import cv2
       
      # 读取两张相同尺寸的图像
      img = cv2.imread("image1.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img is None:
          print("错误:无法读取图像文件")
          exit()
      # 旋转中心,旋转角度,缩放因子
      M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), 45, 1)  # 旋转矩阵
      # 进行旋转
      result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
       
      # 显示结果
      cv2.imshow("Image Rotation", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      调用getAffineTransform将创建变换矩阵,最后该矩阵传递给cv.warpAffine()进行变换。

      • 如果两条线在变换前平行,变换后仍然平行。
      • 位于同一直线上的点在变换后仍然位于同一直线上。
      • 直线上点的比例关系在变换后保持不变。如果点C位于A和B之间,且AC:CB = m:n,则变换后这个比例关系仍然成立。
      # 通过三对对应点建立源图像与目标图像之间的几何映射关系
      M = cv2.getAffineTransform(src, dst)
      参数 类型 描述
      src numpy.ndarray (3×2) 源图像中的三个点坐标 (float32)
      dst numpy.ndarray (3×2) 目标图像中的三个对应点坐标 (float32)

       返回值:M: 2×3 仿射变换矩阵 (numpy.ndarray, dtype=float64)

      此时M:[[  1.26666667   0.6        -83.33333333]
                     [ -0.33333333   1.          66.66666667]]

      import cv2
      import numpy as np
       
      # 读取两张相同尺寸的图像
      img = cv2.imread("image1.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img is None:
          print("错误:无法读取图像文件")
          exit()
       
      # 定义源图像和目标图像的顶点
      pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
      pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
      # 计算仿射变换矩阵
      M = cv2.getAffineTransform(pts1, pts2)
      # 进行仿射变换
      result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
       
      # 显示结果
      cv2.imshow("Affine Transformation", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      通过函数getPerspectiveTransform()找到变换矩阵,将cv.warpPerspective()进行投射变换。

      M = cv2.getPerspectiveTransform(src, dst[, solveMethod])
      参数 类型 描述
      src numpy.ndarray (4×2) 源图像中的四个点坐标 (float32)
      dst numpy.ndarray (4×2) 目标图像中的四个对应点坐标 (float32)
      solveMethod int 矩阵求解方法 (默认 DECOMP_LU)

       此时T:[[ 1.05587376e+00  9.18151097e-02 -6.50969128e+01]
                     [ 4.69010049e-02  1.12562412e+00 -7.57920240e+01]
                     [ 1.83251448e-04  5.13337001e-04  1.00000000e+00]]

      dst = cv2.warpPerspective(
          src, 
          M, 
          dsize, 
          dst=None, 
          flags=cv2.INTER_LINEAR, 
          borderMode=cv2.BORDER_CONSTANT, 
          borderValue=0
      )
      参数 类型 描述 默认值
      src numpy.ndarray 输入图像 (单通道或多通道)
      M numpy.ndarray (3×3) 透 视变换矩阵 (单应性矩阵)
      dsize tuple 输出图像尺寸 (width, height)
      dst numpy.ndarray 输出图像 (预分配内存) None
      flags int 插值方法 + 可选标志 INTER_LINEAR
      borderMode int 边界处理模式 BORDER_CONSTANT
      borderValue scalar 边界填充值 0
      import cv2
      import numpy as np
       
      # 读取两张相同尺寸的图像
      img = cv2.imread("image1.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img is None:
          print("错误:无法读取图像文件")
          exit()
      # 透 视变换
      # 定义源点
      pts1=np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
      # 定义目标点
      pts2=np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
      # 获取透 视变换矩阵
      T=cv2.getPerspectiveTransform(pts1, pts2)
       
      result = cv2.warpPerspective(img, T, (img.shape[1], img.shape[0]))
       
      # 显示结果
      cv2.imshow("Transmission Transformation", result)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      向上采样:cv.pyrUp()

      向下采样:cv.pyrDown()

      dst = cv2.pyrUp(
          src, 
          dst=None, 
          dstsize=None, 
          borderType=cv2.BORDER_DEFAULT
      )
       
      dst = cv2.pyrDown(
          src, 
          dst=None, 
          dstsize=None, 
          borderType=cv2.BORDER_DEFAULT
      )
      参数 类型 描述 默认值
      src numpy.ndarray 输入图像
      dst numpy.ndarray 输出图像 (可选) None
      dstsize tuple 输出图像大小 (width, height) None
      borderType int 边界填充类型 cv2.BORDER_DEFAULT
      import cv2
      import numpy as np
       
      # 读取两张相同尺寸的图像
      img = cv2.imread("image1.jpg")  # 替换为你的图片路径
       
      # 检查图像是否成功读取
      if img is None:
          print("错误:无法读取图像文件")
          exit()
       
      up_img = cv2.pyrUp(img)  # 上采样
      down_img = cv2.pyrDown(img)  # 下采样
       
      # 显示结果
      cv2.imshow("enlarge", up_img)
      cv2.imshow("Image Pyramid", img)
      cv2.imshow("shrink", down_img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      特性 图像金字塔 图像缩放
      目的 创建多尺度表示用于特征分析 改变图像尺寸以适应特定需求
      输出 一组不同尺度的图像序列 单一尺寸的图像
      数学基础 高斯平滑+下采样/上采样 插值算法
      可逆性 不可逆(信息损失) 部分可逆(取决于算法)
      典型应用 多尺度特征检测、图像融合 显示适配、预处理、存储优化
      OpenCV函数 pyrUp()pyrDown() resize()

      以上就是使用Python进行图像几何变换的操作流程的详细内容,更多关于Python图像几何变换的资料请关注风君子博客其它相关文章!

      您可能感兴趣的文章:

      • Python图像处理之几何变换
      • Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
      • Python实现图像几何变换

      站内搜索