使用 OpenCV 实现图像的透视变换
概述
在计算机视觉领域,经常需要对图像进行各种几何变换,如旋转、缩放和平移等。其中,透视变换(Perspective Transformation)是一种非常重要的变换方式,它能够模拟三维空间中的视角变化,例如从不同角度观察同一个物体时所看到的不同效果。本文将详细介绍如何使用 OpenCV 库在 Python 中实现图像的透视变换。
环境准备
在开始之前,请确保已经安装了 OpenCV 库。如果没有安装,可以通过以下命令进行安装:
pip install opencv-python
运行效果
示例代码详解
import cv2
import numpy as np
def func():
"""
读取图像并进行透视变换。
:return:
"""
# 读取图像
img = cv2.imread('./resources/card.jpeg')
print(type(img)) # 输出图像数据类型
print(img.shape) # 输出图像尺寸信息
# 定义目标宽度和高度
width, height = 300, 200
# 原始图像上的四个点坐标
pts1 = np.float32([
[94, 302],
[205, 243],
[152, 369],
[265, 300]
])
# 目标图像上的四个点坐标
pts2 = np.float32([
[0, 0],
[width, 0],
[0, height],
[width, height]
])
# 计算透视变换矩阵
matrix = cv2.getPerspectiveTransform(pts1, pts2)
# 应用透视变换
img_output = cv2.warpPerspective(img, matrix, (width, height))
# 展示原始图像和变换后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Transformed Image', img_output)
# 等待用户按键后退出
cv2.waitKey(0)
if __name__ == '__main__':
func()
代码解析
-
导入必要的库:
import cv2 import numpy as np
cv2
:OpenCV 的 Python 接口。numpy
:用于处理图像数据的数组。
-
定义函数
func
:def func(): """ 读取图像并进行透视变换。 :return: """
-
读取图像:
img = cv2.imread('./resources/card.jpeg') print(type(img)) # 输出图像数据类型 print(img.shape) # 输出图像尺寸信息
- 使用
cv2.imread()
读取图像文件。 print(type(img))
和print(img.shape)
分别用于检查图像数据类型和图像尺寸。
- 使用
-
定义目标宽度和高度:
width, height = 300, 200
-
定义图像上的四个点坐标:
pts1 = np.float32([ [94, 302], [205, 243], [152, 369], [265, 300] ])
pts1
表示在原始图像上的四个点坐标,这些坐标通常代表图像中的某个矩形区域。
-
定义目标图像上的四个点坐标:
pts2 = np.float32([ [0, 0], [width, 0], [0, height], [width, height] ])
pts2
表示变换后目标图像上的四个点坐标,这里我们把原来的矩形区域拉伸成了一个矩形。
-
计算透视变换矩阵:
matrix = cv2.getPerspectiveTransform(pts1, pts2)
- 使用
cv2.getPerspectiveTransform()
获取从原始图像到目标图像的变换矩阵。
- 使用
-
应用透视变换:
img_output = cv2.warpPerspective(img, matrix, (width, height))
- 使用
cv2.warpPerspective()
应用透视变换,得到变换后的图像。
- 使用
-
展示图像:
cv2.imshow('Original Image', img) cv2.imshow('Transformed Image', img_output)
- 使用
cv2.imshow()
分别展示原始图像和变换后的图像。
- 使用
-
等待用户按键后退出:
cv2.waitKey(0)
cv2.waitKey(0)
使得程序等待用户按键后退出。
获取pts1数据的方式:
手动选取:可以使用图像查看工具(例如Photoshop,GIMP等)打开图像,然后手动测量并记录感兴趣区域的四个角的像素坐标。选取坐标时,确保它们形成一个闭合四边形。
编程自动识别:如果目标区域的边缘特征明显,也可以使用图像处理技术(如边缘检测、角点检测等)自动识别这些角点,以便复用或动态生成pts1的值。
实验和调整:在实际使用中,可能需要经过几次实验和调整,以获取最佳的透视变换效果。
在这段代码中,pts1的具体值:
pts1 = np.float32([
[94, 302],
[205, 243],
[152, 369],
[265, 300]
])
这些坐标值为示例数据,意味着选择了原图中具体的一块区域的四个点,具体点的位置需要基于图像的内容而定。在实际应用中,你会根据你希望进行变换的区域选择具体的坐标。
总结
本文通过一个具体的代码示例,详细介绍了如何使用 OpenCV 在 Python 中实现图像的透视变换。透视变换是一种强大的工具,可以帮助我们处理图像中的非平行投影,从而在不同的视角下获取一致的图像。希望本文能帮助你在实际项目中更好地应用这一技术。
以上就是关于使用 OpenCV 实现图像的透视变换的技术讲解,希望对你的学习和实践有所帮助!如果有任何疑问或需要进一步的帮助,请随时提问!