一、引言
在日常生活中,使用手机拍全景照片或通过车载摄像头查看倒车影像时,常常会发现画面出现一定程度的变形。例如,建筑物的直线会被拉弯,或者车身轮廓显得不自然。这种现象就是图像畸变,它可能影响美观,甚至在某些情况下对实际应用带来困扰。
图像矫正技术能够有效解决这些问题,还原真实的场景。本博客将通过一个简单的实验,带你了解图像矫正的基本原理与实现过程,帮助初学者快速上手。
二、实验原理
图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。
透视变换是把一个图像投影到一个新的视平面的过程,透视投影是指将三维空间中的物体投影到二维平面上的过程,这个过程会导致物体在图像中出现形变和透视畸变。透视变换可以通过数学模型来校正这种透视畸变,使得图像中的物体看起来更符合我们的直观感受。
三、实验代码
3.1 功能简介
cv2.getPerspectiveTransform(src, dst)
用于计算透视变换矩阵。给定原始四个点和目标四个点,它计算出一个透视变换矩阵,可以将一个图像从原始视角转换到目标视角。
3.2 参数详解
src:
原始图像中选定的四个点的坐标,类型是一个形状为 (4, 2) 的 numpy 数组,表示原图中的四个角点。
dst:
目标图像中的四个点的坐标,类型是一个形状为 (4, 2) 的 numpy 数组,表示透视变换后映射的四个角点。
3.3 返回值
返回一个 3x3 的透视变换矩阵 `M`,该矩阵用于在后续的 `cv2.warpPerspective` 中进行变换。
3.4 功能简介
cv2.warpPerspective(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=None)
用于将图像 `src` 应用透视变换矩阵 `M`,并生成变换后的图像。通过指定输出图像的大小和变换矩阵,可以对图像进行缩放、旋转或其他透视变换。
3.5 参数详解
src:
输入图像,即需要进行透视变换的图像。
M:
透视变换矩阵,通过 `cv2.getPerspectiveTransform` 获得。
dsize:
目标图像的大小 (宽度, 高度),指定透视变换后图像的输出尺寸。
dst:
可选,输出图像。如果不提供,默认返回一个新的图像。
flags:
插值方法,用于控制图像的像素插值方式。
常用的有:
cv2.INTER_LINEAR: 双线性插值(默认)
cv2.INTER_NEAREST: 最近邻插值
cv2.INTER_CUBIC: 三次插值
cv2.INTER_LANCZOS4: Lanczos 插值
borderMode:
边界模式,用于指定图像变换时的边界处理方式。
常见的选项包括:
cv2.BORDER_CONSTANT: 使用常量边界,常用于填充指定颜色。
cv2.BORDER_REPLICATE: 边界像素复制。
cv2.BORDER_REFLECT: 边界像素反射。
cv2.BORDER_WRAP: 使用环绕边界。
borderValue:
用于 `cv2.BORDER_CONSTANT` 时,设置边界的填充颜色。
3.6 返回值
返回变换后的图像。如果提供了 `dst` 参数,则将变换结果存储在 `dst` 中;如果没有提供,则返回一个新的图像。
3.7 代码实现
将油画矫正:
代码:
import cv2
import numpy as np
# 1、读取一张图片
img = cv2.imread('./youhua.png')
# 2、获取透视变换矩阵
# 原图中的四个点
points1 = np.float32([[175,142],[621,35],[89,491],[652,546]])
# 目标图中的四个点
points2 = np.float32([[min(points1[:,0]), min(points1[:,1])],
[max(points1[:,0]), min(points1[:,1])],
[min(points1[:,0]), max(points1[:,1])],
[max(points1[:,0]), max(points1[:,1])]
])
M = cv2.getPerspectiveTransform(points1,points2)
# 3、透视变换
img_warp = cv2.warpPerspective(img, M, (img.shape[1],img.shape[0]))
cv2.imshow('image',img)
cv2.imshow('image_warp',img_warp)
cv2.waitKey(0)
四、实验现象
五、结语
无论是扭曲的油画,还是变形的文档,透视变换都能为它们带来新生。通过 Python 和 OpenCV,我们不仅能纠正图像的‘歪斜’,还可以让它们重新回到正轨。下一次,遇到图像走偏的情况,记得给它们一点‘透视’的帮助,恢复原本的美感!
如果你有任何问题或建议,欢迎在评论区分享你的想法。希望你在图像处理的道路上不断探索、不断进步!
感谢你的阅读,祝你编程愉快!