一、概述
图像失真是指由于光学元件的制造或摆放方式以及摄像机的成像方式等原因,在图像获取和处理过程中所引入的形变或畸变。常见的图像失真类型有径向失真和切向失真。针对图像的失真,在 OpenCV 中提供了一系列的 API 进行消除,其中最常用的方法就是 cv2.undistort
。本文将详细介绍 cv2.undistort
的使用方法和相关细节。
二、函数介绍
cv2.undistort
函数用于消除图像失真,并返回矫正后的图像。函数的定义如下:
cv2.undistort(src, cameraMatrix, distCoeffs, dst=None, newCameraMatrix=None)
1. 参数说明
src
: 输入图像cameraMatrix
: 相机内参矩阵,包括焦距等参数distCoeffs
: 相机畸变系数,包括径向畸变和切向畸变等dst
: 输出矫正后的图像,和原图像大小相同newCameraMatrix
: 新的相机内参矩阵,可以为空。如果不为空,表示要调整输出图像的焦距和中心点(裁剪图像将丢失图像的部分)
2. 返回值说明
如果 dst
不为空,则返回矫正后的图像。如果 dst
为空,则返回新的相机内参矩阵。
三、使用方法
1. 相机内参矩阵和相机畸变系数
相机内参矩阵和相机畸变系数是矫正图像的重要参数。可以通过相机标定得到。相机标定的流程和相关知识不在本文介绍范围内,如果需要了解可以参考其他相关教程。
相机内参矩阵是一个 3x3 的矩阵,包括焦距 fx
和 fy
,以及图像中心点的坐标 cx
和 cy
。可以用来将像素坐标转化为相机坐标,即像素坐标到归一化平面坐标的映射。相机畸变系数则是用来表示畸变形状和强度的参数,包括五个或八个参数,其中五个参数表示径向畸变,另外三个参数表示切向畸变。这些参数也可以通过相机标定得到。
2. 矫正图像
接下来,我们介绍如何使用上述参数来矫正图像。 首先,我们需要加载一张含有失真的图像,并读取相机内参矩阵和相机畸变系数,代码如下:
import cv2
# 读取含有失真的图像
img = cv2.imread("image.jpg")
# 读取相机内参矩阵和相机畸变系数
cameraMatrix = np.array([[2520., 0., 1260.], [0., 2520., 960.], [0., 0., 1.]])
distCoeffs = np.array([[-0.4, 0.2, 0., 0., 0.]])
然后,我们使用 cv2.undistort
函数进行矫正,代码如下:
# 进行矫正
dst = cv2.undistort(img, cameraMatrix, distCoeffs)
最后,我们可以将矫正前后的图像进行对比,代码如下:
# 显示原图和矫正后的图像
cv2.imshow("Original Image", img)
cv2.imshow("Undistorted Image", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 调整输出图像
通过 cv2.undistort
函数可以对图像进行矫正,并输出矫正后的图像。可以选择调整输出图像的焦距和中心点,以达到不裁剪图像的效果。
假设我们需要将原图像的焦距调整为 fx = 1000
,fy = 1000
,中心点调整为 cx = 600
,cy = 400
,代码如下:
# 调整输出图像的焦距和中心点
newCameraMatrix = np.array([[1000., 0., 600.], [0., 1000., 400.], [0., 0., 1.]])
dst1 = cv2.undistort(img, cameraMatrix, distCoeffs, None, newCameraMatrix)
# 显示原图和矫正后的图像
cv2.imshow("Original Image", img)
cv2.imshow("Adjusted Undistorted Image", dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、总结
本文介绍了 OpenCV 中消除图像失真的常用函数 cv2.undistort
的使用方法和参数细节,包括相机内参矩阵、相机畸变系数、矫正后的图像以及调整输出图像等。在图像处理中,使用 cv2.undistort
函数可以有效提高图像的质量和准确度。