Python+OpenCV系列:图像的几何变换

Python + OpenCV 系列:图像的几何变换

引言

在图像处理领域,几何变换是一个非常重要的操作,它可以改变图像的位置、大小、方向或形状。在计算机视觉中,这些操作对于图像预处理、特征提取和图像增强至关重要。本文将介绍如何利用 Python 的 OpenCV 库实现图像的几何变换,包括平移、旋转、缩放、仿射变换和透视变换。


1. 什么是几何变换?

几何变换是通过数学变换将图像的像素从一个位置映射到另一个位置的过程。根据变换的性质,可以将其分为以下几类:

  • 平移:移动图像位置。
  • 缩放:调整图像尺寸。
  • 旋转:改变图像方向。
  • 仿射变换:对图像进行线性变换,包括平移、旋转、缩放和倾斜。
  • 透视变换:改变图像的视角,使其产生三维效果。

2. OpenCV 几何变换基本操作

2.1 平移

平移是将图像沿 x 和 y 轴移动,公式如下:

x ′ y ′ \] = \[ x y \] + \[ t x t y \] \\begin{bmatrix} x' \\\\ y' \\end{bmatrix} = \\begin{bmatrix} x \\\\ y \\end{bmatrix} + \\begin{bmatrix} tx \\\\ ty \\end{bmatrix} \[x′y′\]=\[xy\]+\[txty

在 OpenCV 中实现:

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 定义平移矩阵 [1, 0, tx] 和 [0, 1, ty]
tx, ty = 100, 50
M = np.float32([[1, 0, tx], [0, 1, ty]])

# 执行平移变换
shifted = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

cv2.imshow('Shifted Image', shifted)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 缩放

缩放是按比例放大或缩小图像尺寸。在 OpenCV 中,使用 cv2.resize()

python 复制代码
# 缩放图像到指定大小
resized = cv2.resize(img, (300, 200))

# 按比例缩放
scaled = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
2.3 旋转

旋转变换公式:

x ′ y ′ \] = \[ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ \] \[ x y \] \\begin{bmatrix} x' \\\\ y' \\end{bmatrix} = \\begin{bmatrix} \\cos\\theta \& -\\sin\\theta \\\\ \\sin\\theta \& \\cos\\theta \\end{bmatrix} \\begin{bmatrix} x \\\\ y \\end{bmatrix} \[x′y′\]=\[cosθsinθ−sinθcosθ\]\[xy

在 OpenCV 中实现:

python 复制代码
(h, w) = img.shape[:2]
center = (w // 2, h // 2)

# 生成旋转矩阵
angle = 45
scale = 1.0
M = cv2.getRotationMatrix2D(center, angle, scale)

# 执行旋转
rotated = cv2.warpAffine(img, M, (w, h))
2.4 仿射变换

仿射变换通过三个点的映射定义图像变换。在 OpenCV 中使用 cv2.getAffineTransform()

python 复制代码
# 定义原图像和目标图像的三个点
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])

# 获取仿射变换矩阵
M = cv2.getAffineTransform(pts1, pts2)

# 执行仿射变换
affined = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
2.5 透视变换

透视变换通过四个点定义,可以改变图像的视角:

python 复制代码
# 定义原图像和目标图像的四个点
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])

# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)

# 执行透视变换
warped = cv2.warpPerspective(img, M, (300, 300))

3. 实用技巧与注意事项

  1. 边界处理:几何变换可能会导致部分像素超出边界,建议在设计时考虑图像的大小。
  2. 插值方法
    • cv2.INTER_NEAREST:最近邻插值,速度快但效果较差。
    • cv2.INTER_LINEAR:双线性插值,适用于缩放。
    • cv2.INTER_CUBIC:三次插值,适合高质量变换。
  3. 变换顺序:如果需要同时进行多个几何变换(如旋转后平移),可以通过矩阵乘法将多个变换合并。

4. 应用场景

  • 图像校正:修正拍摄中的倾斜、畸变。
  • 特征对齐:人脸识别中常用仿射变换将人脸对齐。
  • 数据增强:通过随机几何变换扩展数据集,用于训练深度学习模型。
  • 视觉特效:制作图像的动态效果或艺术处理。

5. 总结

几何变换是图像处理中不可或缺的工具,OpenCV 提供了高效的方法来实现各种变换操作。在理解每种变换的数学原理后,可以根据应用场景灵活组合这些技术,从而完成更复杂的图像处理任务。希望这篇文章能够帮助你更好地掌握 Python + OpenCV 中的几何变换操作!

相关推荐
zhy29563几秒前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
抓不住时间的沙10 分钟前
N1搭建Hexo个人博客,部署到Github
python·docker·node.js·debian·github·arm
W_3260010 分钟前
Python-OpenCV:画布、图形、文字、调色滑动条
图像处理·python·opencv·机器学习·计算机视觉
爱跳舞的烤冷面12 分钟前
自学嵌入式第N天(Linux篇——文件编程)
java·开发语言·前端
Promising_GEO18 分钟前
新电脑科研环境配置指南:Miniforge + PyCharm + GitHub 从安装到可用
ide·python·pycharm·github·地理
Patrick在香港32 分钟前
Claude API 成本直降90%:Prompt Caching 提示词缓存 Python 实战
python·缓存·prompt
caimouse1 小时前
ReactOS 图形系统分析(33):字体子系统 — font.c
c语言·开发语言·reactos
郝学胜-神的一滴1 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
她说可以呀1 小时前
Spring AI 常用 Advisor
人工智能·python·spring
cxr8281 小时前
HyperMind Lab M1 架构地基 Implementation Plan <二>
开发语言·人工智能·架构