什么是鱼眼畸变?先搞清楚再动手
鱼眼镜头把180°甚至220°的视角塞进一张矩形照片,代价就是桶形畸变:直线变弧线、人脸被拉成“气球”。想校正,得先分清两种畸变:

- 径向畸变:越靠近边缘拉伸越夸张,数学上可用r²、r⁴、r⁶多项式描述。
- 切向畸变:镜头与传感器不平行造成的“倾斜”,参数p₁、p₂就能搞定。
校正前必须做的三件事
1. 拿到镜头内参——标定板别省
没有内参,任何软件都“盲修”。用A4打印黑白棋盘格,拍15张不同角度,OpenCV的findChessboardCorners自动提取角点,跑calibrateCamera即可得到:
- 焦距fx、fy
- 主点cx、cy
- 畸变系数k₁-k₆、p₁、p₂
2. 选对投影模型——等距、等积还是立体?
鱼眼有四种主流投影:
- 等距投影:r = f·θ,校正后视角损失最小。
- 等积投影:保留面积比例,适合科研测量。
- 正交投影:边缘压缩严重,不建议。
- 立体投影:画面最自然,但计算量翻倍。
实战:Lightroom三步搞定轻度畸变
如果只想让建筑恢复直线,Lightroom的“启用配置文件校正”最快:
- 在“镜头校正”面板勾选“删除色差”。
- 选择对应品牌与型号,软件自动加载内参。
- 手动拉“扭曲度”滑块,直到垂直线笔直。
注意:Lightroom仅支持原厂镜头库,国产手动镜头得用DNG+Adobe Lens Profile Creator自制。
进阶:OpenCV鱼眼模块校正超广角
代码片段(Python)
import cv2
import numpy as np
# 读取标定结果
K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
D = np.array([k1, k2, k3, k4])
# 校正
img = cv2.imread('fisheye.jpg')
h, w = img.shape[:2]
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, (w, h), cv2.CV_16SC2)
undistorted = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
关键参数:

- balance:0表示完全裁剪,1保留全部像素但黑边多。
- fov_scale:手动缩放视角,解决“校正后画面变窄”问题。
全景拼接前必须校正吗?
自问:直接拼接鱼眼原片行不行? 自答:可以,但特征点匹配错误率会飙升。 建议先用圆柱或等距圆柱投影把鱼眼拉成直线,再交给Hugin或PTGui,拼接效率提升。
手机鱼眼怎么修?Snapseed隐藏技巧
很多人不知道,Snapseed的“视角”→“自由”里藏着鱼眼修复:
- 用“垂直/水平”拉直建筑。
- 双指放大画面,抵消边缘拉伸。
- 最后加“镜头模糊”把黑角过渡掉。
缺点:只能处理轻度畸变,超广角还是得靠Lightroom Mobile。
校正后画质会下降吗?
自问:像素被重新采样,锐度会不会崩? 自答:边缘会柔化,但可用AI超分补救。Topaz Gigapixel的“压缩修复”模式对校正后的照片尤其有效,放大1.5倍即可抵消插值损失。
常见坑:为什么校正后画面更歪?
- 标定板没拍全:边缘区域缺失,内参不准。
- 镜头防抖未关:微抖导致光轴偏移。
- 手动镜头调焦后没重新标定:焦距变了,旧内参失效。
一句话记住核心
先标定,再选投影,最后选工具——顺序错了,再贵的软件也救不回来。

还木有评论哦,快来抢沙发吧~