如何使用OpenCV结合自定义内参矩阵和畸变参数对鱼眼图像进行去畸变处理
如何使用OpenCV结合自定义内参矩阵和畸变参数对鱼眼图像进行去畸变处理
我之前做过一个有趣的小实验:用一张灰度值随cos(wx)规律变化的图像,通过自定义内参矩阵和畸变参数,用Python结合OpenCV实现了鱼眼畸变效果,现在把过程和代码分享给你~
先看看实验用到的图像:
- 原始图像:这是一张呈现周期性明暗条纹的图像,灰度值会随着
cos(wx)的变化规律波动 - 鱼眼畸变后的图像:经过处理后,原本的直线条纹会呈现出明显的向中心凹陷的扭曲效果,是典型的鱼眼镜头视觉特征
下面是实现这个效果的核心Python代码:
import numpy as np import cv2 def fisheye_effect(original_img): # 获取原始图像的高度和宽度 h, w = original_img.shape[:2] # 自定义内参矩阵K:焦距设为图像宽高,主点位于图像中心 K = np.array([[w, 0, w / 2], [0, h , h / 2], [0, 0, 1]]) # 自定义鱼眼畸变参数D:前两个参数控制畸变程度,后两个设为0 D = np.array([2.0, 1.0, 0, 0]) # 生成畸变映射表 map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, None, K, (w, h), cv2.CV_16SC2) # 应用映射表得到鱼眼畸变图像 fisheye_img = cv2.remap(original_img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) # 保存处理后的图像(注意这里的fisheye_path需要你提前定义好保存路径) cv2.imwrite(fisheye_path, fisheye_img)
简单解释下代码里的关键步骤:
- 先获取原始图像的尺寸,这是定义内参矩阵的基础
- 内参矩阵K:这里我们把x和y方向的焦距分别设为图像的宽度和高度,主点(图像光学中心)放在图像的中心位置,这是比较常用的自定义内参设置方式
- 畸变参数D:鱼眼畸变的参数通常有4个,前两个参数主要控制畸变的程度,数值越大畸变效果越明显,后两个参数我们暂时设为0即可
cv2.fisheye.initUndistortRectifyMap函数会根据我们设置的内参和畸变参数,生成用于图像映射的查找表,这一步是鱼眼畸变处理的核心- 最后用
cv2.remap把原始图像按照生成的映射表进行变换,就能得到我们想要的鱼眼畸变效果了
备注:内容来源于stack exchange,提问作者Nightysky
相关产品推荐
相关产品推荐

