使用 OpenCV 进行图像矫正

在图像处理领域,图像矫正是一个重要的课题,尤其是当你拍摄的照片由于镜头畸变或其他因素,导致图像失真时。OpenCV(Open Source Computer Vision Library)是一个强大的计算机视觉库。在本文中,我们将探讨如何使用 OpenCV 和 Python 对图像进行矫正,同时也会通过一个例子来演示整个过程。

什么是图像矫正?

图像矫正是指通过调整图像的几何形状和色彩来消除或减少失真。常见的失真类型包括:

  1. 透视失真:拍摄时角度不当导致图像扭曲。
  2. 镜头畸变:镜头造成的图像边缘失真,例如桶形或枕形畸变。
  3. 颜色失真:由于光照条件变化导致的颜色偏差。

在本文中,我们主要关注镜头畸变的矫正。

安装 OpenCV

首先,确保你已经安装了 OpenCV。可以使用以下命令通过 pip 安装:

pip install opencv-python
pip install opencv-python-headless  # 对于不需要 GUI 的环境

获取标定数据

在进行图像矫正之前,你需要获取相机的内参和畸变参数。这通常通过棋盘格标定来实现。下面是一个简单的棋盘格标定的示例代码。

棋盘格标定代码示例

import cv2
import numpy as np
import glob

# 设置棋盘格的尺寸
chessboard_size = (9, 6)
frame_size = (640, 480)

# 准备棋盘格角点的对象点
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)

# 用于存储所有图像中的对象点和图像点
objpoints = []   # 3d 点在世界坐标系中
imgpoints = []   # 2d 点在图像平面中

# 读取棋盘格图像
images = glob.glob('path/to/chessboard/images/*.jpg')

for img_name in images:
    img = cv2.imread(img_name)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 查找棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
    
    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)

# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

# 保存相机参数
np.savez('camera_params.npz', mtx=mtx, dist=dist)

此代码会去找你指定路径下棋盘格的图像,提取角点,并进行相机标定。最终,它将保存相机的内参数(mtx)和畸变参数(dist)到一个文件中。

图像矫正

标定完成后,你可以使用以下代码进行图像矫正。使用之前保存的相机参数来矫正畸变图像。

图像矫正代码示例

import cv2
import numpy as np

# 加载相机参数
with np.load('camera_params.npz') as data:
    mtx = data['mtx']
    dist = data['dist']

# 读取需要矫正的图像
img = cv2.imread('path/to/your/image.jpg')
h, w = img.shape[:2]

# 获取新的相机矩阵
new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

# 矫正图像
dst = cv2.undistort(img, mtx, dist, None, new_mtx)

# 裁剪图像
x, y, w, h = roi
dst = dst[y:y+h, x:x+w]

# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Undistorted Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中,我们首先加载相机参数,然后读取一幅需要矫正的图像。使用 cv2.undistort() 函数,根据标定的参数去畸变。最后,我们通过 OpenCV 的窗口显示结果。

旅行的故事

在旅行中,我们常常会拍摄各种美丽的景色。然而,由于拍摄时角度的原因,许多照片可能呈现出扭曲的效果。图像矫正的方法可以帮助我们恢复图像的真实形态。

journey
    title 我的旅行故事
    section 准备
      安排旅行计划: 5: 我和朋友计划去爬山
      准备相机: 4: 确保我的相机已调好设置
    section 拍摄
      爬山途中拍照: 4: 记录美丽的风景
      照片出现畸变: 3: 发现拍的照片有些变形
    section 矫正
      使用OpenCV进行图像矫正: 5: 图片恢复了原有的形态
      分享给朋友: 4: 大家都称赞我的摄影技巧

总结

今天我们探讨了如何使用 OpenCV 进行图像矫正,包括获取相机参数和矫正图像的步骤。通过简单的代码示例,我们能够快速上手并应用这一技术。无论是日常照片还是旅行中的美景,掌握图像矫正的方法,能够让你的作品更加出色。希望这篇文章能帮助你在图像处理的旅程中更加顺利。