OpenCV核心内容100讲【第08讲】图像的几何变换进阶:旋转、仿射变换

文摘   2025-01-08 00:01   天津  

8 图像的几何变换进阶:旋转、仿射变换

继缩放与平移之后,我们将探讨图像几何变换的进阶知识,包括旋转和仿射变换。这些变换不仅可以改变图像的位置和尺寸,还能改变图像的方向和形状。在图像分析、匹配和识别等领域中,这些操作是至关重要的。

图像旋转

图像旋转是将图像按照某一点作为中心进行旋转,可以是顺时针或逆时针。OpenCV提供了cv2.getRotationMatrix2Dcv2.warpAffine函数来帮助我们实现这个过程。

旋转示例

import cv2

# 读取图像
image = cv2.imread('example.jpg')
rows, cols = image.shape[:2]

# 旋转中心点为图像中心,旋转角度为90度,不改变图像尺寸
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 901)
rotated_image = cv2.warpAffine(image, M, (cols, rows))

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image', rotated_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

这里,cv2.getRotationMatrix2D需要三个参数:旋转的中心点坐标,旋转角度(逆时针为正值),以及图像缩放比例(1表示大小不变)。这会返回一个旋转矩阵M,它被用在cv2.warpAffine函数中实现旋转。

仿射变换

仿射变换是更一般的线性映射,它包含了旋转、缩放、平移和倾斜等多种变换。通过仿射变换可以实现图像的两点或三点定位。这意味着我们可以将图像上的三个点映射到一个新位置,其他点也将跟随移动以保持直线线性和平行线间的比例。

仿射变换示例

import cv2
import numpy as np

image = cv2.imread('example.jpg')
rows, cols, ch = image.shape

# 原图中的三个点以及它们在输出图像中的位置
pts1 = np.float32([[5050], [20050], [50200]])
pts2 = np.float32([[10100], [20050], [100250]])

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

# 应用仿射变换
warped_image = cv2.warpAffine(image, M, (cols, rows))

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Warped Affine Image', warped_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们需要先定义原图中三个点pts1和目标图像中对应的三个点pts2,然后使用cv2.getAffineTransform来获取仿射变换矩阵M。cv2.warpAffine函数将使用这个矩阵来完成变换。

结合应用与例题

将旋转与仿射变换结合起来,我们可以实现更为复杂的图像空间变换。例如,想象一个需要将地图上的一个区域进行校正以匹配另一张海图的情况。这可能需要先将图像旋转来校对方向,然后进行必要的仿射变换以映射特定的地理特征。

结合示例

import cv2
import numpy as np

image = cv2.imread('map.jpg')
rows, cols, ch = image.shape

# 旋转后的仿射变换
M_rot = cv2.getRotationMatrix2D((cols / 2, rows / 2), 451)
rotated_image = cv2.warpAffine(image, M_rot, (cols, rows))

# 仿射变换的三点
pts1 = np.float32([[100100], [200100], [100200]])
pts2 = np.float32([[80150], [200130], [120220]])

M_affine = cv2.getAffineTransform(pts1, pts2)
warped_image = cv2.warpAffine(rotated_image, M_affine, (cols, rows))

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Transformed Image', warped_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

在处理计算机视觉问题时,进阶的图像几何变换提供了更多的手段来对图像进行校正和准备,为后续的图像处理步骤打下坚实的基础。无论是在进行模式识别还是在增强图像质量时,了解和掌握这些变换原理和技术都是非常有助益的。

通过本节的学习,我们深入了解了图像的旋转和仿射变换,这两种技术是我们在进行更高级图像处理和分析时不可或缺的工具。在未来的章节中,我们将继续探索其他维度的几何变换,如透视变换等,进一步开拓我们对计算机视觉领域的理解和应用。



这里简单介绍了一些基本知识点,更细致的内容请参考:

  • 李立宗,OpenCV轻松入门(第2版),电子工业出版社,2023
  • 李立宗,计算机视觉40例(从入门到深度学习:OpenCV-Python),电子工业出版社,2022


在公众号【计算机视觉之光】回复 【OpenCV模拟试卷】获得参考答案。

单击【阅读原文】参加OpenCV-Python课程学习。

在本公众号【计算机视觉之光】回复关键字“叮叮当当”获取更多的Python学习资料。



计算机视觉之光
电子工业出版社优秀作者,代表作《OpenCV轻松入门》,《计算机视觉40例》。
 最新文章