欢迎光临
我们一直在努力

【OpenCV 图像处理】图像几何变换:从基础缩放旋转到高级透视变换

1. 学习目标

在本章节中,我们将深入探讨数字图像空间变换的核心技术。通过理论与 API 的结合,你将:

  • 掌握图像的缩放、平移和旋转等基础操作。
  • 理解仿射变换与透视变换的数学原理及应用场景。
  • 了解图像金字塔在多尺度表达中的作用。

2. 图像缩放 (Scaling)

图像缩放是指调整图像的大小。在 OpenCV 中,主要通过 cv2.resize() 实现。

2.1 缩放方式

  • 绝对尺寸:直接指定目标图像的宽度和高度(dsize)。
  • 相对尺寸:通过水平(fx)和垂直(fy)方向的缩放因子来调整。
  • 2.2 插值方法 (Interpolation)

    缩放过程中需要对像素进行重采样,不同的插值算法会影响图像质量:

    插值方法OpenCV 标识符特点与建议场景
    最近邻插值 cv2.INTER_NEAREST 速度最快,但图像边缘会有明显锯齿。
    双线性插值 cv2.INTER_LINEAR 默认方法。速度与质量的折中方案。
    像素区域重采样 cv2.INTER_AREA 效果最好,特别是在图像缩小时可避免波纹。
    双三次插值 cv2.INTER_CUBIC 计算量大,在图像放大时效果优于双线性。

    import cv2 as cv
    import matplotlib.pyplot as plt

    img = cv.imread("dog.jpg")

    # 1. 绝对尺寸缩放:放大为原来的 2 倍
    rows, cols = img.shape[:2]
    res = cv.resize(img, (2*cols, 2*rows), interpolation=cv.INTER_CUBIC)

    # 2. 相对尺寸缩放:缩小为原来的 0.5 倍
    res1 = cv.resize(img, None, fx=0.5, fy=0.5)

    # 显示结果
    plt.figure(figsize=(12, 4))
    titles = ['Original', 'Enlarge (2x)', 'Shrink (0.5x)']
    images = [img, res, res1]
    for i in range(3):
    plt.subplot(1, 3, i+1), plt.imshow(images[i][:,:,::1]), plt.title(titles[i])
    plt.show()


    3. 图像平移 (Translation)

    平移是将图像中所有的像素点按照指定的水平量

    t

    x

    t_x

    tx 和垂直量

    t

    y

    t_y

    ty 进行移动。

    3.1 变换矩阵 M

    平移变换使用一个

    2

    ×

    3

    2 \\times 3

    2×3 的矩阵表示。若要将点

    (

    x

    ,

    y

    )

    (x, y)

    (x,y) 移动到

    (

    x

    +

    t

    x

    ,

    y

    +

    t

    y

    )

    (x+t_x, y+t_y)

    (x+tx,y+ty),矩阵定义如下:

    M

    =

    [

    1

    0

    t

    x

    0

    1

    t

    y

    ]

    M = \\begin{bmatrix} 1 & 0 & t_x \\\\ 0 & 1 & t_y \\end{bmatrix}

    M=[1001txty] 注意:在 OpenCV 中,该矩阵必须以 np.float32 格式提供给 cv.warpAffine 函数。

    import numpy as np
    import cv2 as cv

    img = cv.imread("dog.jpg")
    rows, cols = img.shape[:2]

    # 设置平移矩阵:向右移动100像素,向下移动50像素
    M = np.float32([[1, 0, 100], [0, 1, 50]])

    # 调用仿射变换函数
    dst = cv.warpAffine(img, M, (cols, rows))

    cv.imshow('Shifted', dst)
    cv.waitKey(0)


    4. 图像旋转 (Rotation)

    旋转是指图像绕某个中心点转动一定角度的过程。

    4.1 旋转原理与修正

    由于图像的物理坐标原点在左上角,旋转后通常会导致原点偏移或图像超出边界。OpenCV 提供了专门的 API 来计算旋转矩阵,自动处理旋转中心的坐标转换。

    4.2 核心 API

    • 计算矩阵:使用 cv2.getRotationMatrix2D(center, angle, scale)。
      • center:旋转中心坐标。
      • angle:旋转角度(正值表示逆时针)。
      • scale:各向同性的缩放因子。
    • 执行旋转:依然使用 cv.warpAffine 函数应用该矩阵。

    # 旋转中心为图像中点,旋转90度,缩放比例为1
    M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
    dst = cv.warpAffine(img, M, (cols, rows))


    5. 仿射变换 (Affine Transformation)

    仿射变换是线性变换(缩放、旋转、翻转)与平移的组合。

    5.1 核心特性

    • 平行性保持:原图像中的平行线在变换后依然保持平行。
    • 点对映射:仿射变换具有 6 个自由度,因此需要通过原图中的三个点及其在目标图中的对应位置来确定变换矩阵(2×3 矩阵)。
    • API:cv.getAffineTransform 用于生成矩阵。

    # 原图中的三个点和对应的新位置
    pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
    pts2 = np.float32([[100, 100], [200, 50], [100, 250]])

    # 获取仿射矩阵
    M = cv.getAffineTransform(pts1, pts2)
    dst = cv.warpAffine(img, M, (cols, rows))


    6. 透射变换 (Perspective Transformation)

    透射变换(投影变换)模拟了物体在不同视角下的成像变化。

    6.1 变换本质

    透射变换将图像投影到一个新的视平面。与仿射变换不同,透射变换不保证平行性,但保证“共线性”(原图中的直线在变换后仍为直线)。

    6.2 确定条件

    • 四点映射:透射变换有 8 个自由度,需要原图中四个点(任意三点不共线)及其对应位置。
    • 变换矩阵:使用

      3

      ×

      3

      3 \\times 3

      3×3 的矩阵。

    • API:通过 cv.getPerspectiveTransform 获取矩阵,并使用 cv.warpPerspective 进行变换。

    # 透射变换
    rows,cols = img.shape[:2]
    # 创建变换矩阵
    pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
    pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])

    T = cv.getPerspectiveTransform(pts1,pts2)
    # 进行变换
    dst = cv.warpPerspective(img,T,(cols,rows))


    7. 图像金字塔 (Image Pyramids)

    图像金字塔是一系列分辨率逐步降低的图像集合,常用于多尺度分析、图像融合和特征提取。

    7.1 分类与 API

  • 向下采样 (pyrDown):
    • 原理:先进行高斯模糊,再删除偶数行和列。
    • 结果:图像面积变为原来的 1/4,分辨率降低。
  • 向上采样 (pyrUp):
    • 原理:在每个方向上扩大为原来的两倍,新增行/列填 0,再用高斯核卷积。
    • 结果:图像放大,但因丢失了高频信息,图像会比原图模糊。
  • up_img = cv.pyrUp(img) # 上采样操作
    img_1 = cv.pyrDown(img) # 下采样操作


    8. 总结汇总表

    变换类型关键 API矩阵维度映射点数特点
    缩放 cv.resize 改变分辨率/尺寸
    平移 cv.warpAffine

    2

    ×

    3

    2 \\times 3

    2×3

    位置位移
    旋转 cv.getRotationMatrix2D

    2

    ×

    3

    2 \\times 3

    2×3

    绕点旋转
    仿射变换 cv.getAffineTransform

    2

    ×

    3

    2 \\times 3

    2×3

    3 个点 保持平行性
    透射变换 cv.getPerspectiveTransform

    3

    ×

    3

    3 \\times 3

    3×3

    4 个点 视角变换/投影
    金字塔 cv.pyrUp / cv.pyrDown 多尺度表达

    参考资料

    本文理论内容参考: 黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程


    如果您觉得本文对您有帮助,欢迎点赞、收藏并关注我!

    赞(0)
    未经允许不得转载:171主机测评 » 【OpenCV 图像处理】图像几何变换:从基础缩放旋转到高级透视变换
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址