关于对鱼眼相机图片进行畸变校正的两种思路

发布于:2025-09-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

鱼眼畸变校正传统几何方法与神经网络方法

引言

鱼眼镜头(Fisheye Lens)因其超广角特性,能够捕捉高达180°或更宽的视野,在全景摄影、监控系统、机器人视觉等领域广泛应用。然而,鱼眼镜头会引入严重的径向畸变,导致图像边缘物体变形,影响后续的计算机视觉任务如物体检测、3D重建等。畸变校正(Distortion Correction)旨在将畸变图像转换为接近针孔相机模型的无畸变图像。

传统几何方法神经网络方法。传统几何方法基于数学模型和相机标定,依赖精确的物理建模;神经网络方法则利用深度学习从数据中学习映射,具有更强的泛化能力,但需大量训练数据。煮啵将涉及详细的数学公式、步骤推导和实现要点,希望有助于进行解决思路的选择!

鱼眼畸变概述

鱼眼畸变主要表现为径向畸变(Radial Distortion),图像中心正常,边缘向外拉伸。畸变模型通常基于入射角θ\thetaθ(光线与光学轴夹角)和图像半径rrr的关系。

常见鱼眼投影模型包括:

  • 等距投影(Equidistant Projection)rd=fθr_d = f \thetard=fθ,其中rdr_drd为畸变图像半径,fff为焦距,θ\thetaθ为入射角。
  • 等立体角投影(Equisolid Angle Projection)rd=2fsin⁡(θ/2)r_d = 2f \sin(\theta/2)rd=2fsin(θ/2)
  • 正交投影(Orthographic Projection)rd=fsin⁡θr_d = f \sin \thetard=fsinθ
  • 立体投影(Stereographic Projection)rd=2ftan⁡(θ/2)r_d = 2f \tan(\theta/2)rd=2ftan(θ/2)

这些模型描述了从3D世界点到2D图像的投影。校正过程本质上是逆映射:从畸变图像坐标(ud,vd)(u_d, v_d)(ud,vd)到无畸变坐标(u,v)(u, v)(u,v)

传统几何方法

传统几何方法依赖相机内参(Intrinsic Parameters)和畸变参数(Distortion Parameters)的标定,通过数学公式进行逆变换。核心步骤包括:标定、模型拟合和像素重映射。以下详细讲解。

1. 畸变模型

鱼眼畸变的数学建模通常结合投影模型和多项式畸变。常见的是Brown-Conrady多项式模型,扩展了径向和切向畸变。

径向畸变模型

对于给定图像点(x,y)(x, y)(x,y)(归一化坐标,相对于主点),计算畸变半径r=x2+y2r = \sqrt{x^2 + y^2}r=x2+y2 。畸变偏移δr\delta rδr为:
δr=k1r3+k2r5+k3r7+⋯+knr2n+1 \delta r = k_1 r^3 + k_2 r^5 + k_3 r^7 + \cdots + k_n r^{2n+1} δr=k1r3+k2r5+k3r7++knr2n+1
其中k1,k2,…k_1, k_2, \dotsk1,k2,为径向畸变系数(通常取前三项)。

畸变后坐标(xd,yd)(x_d, y_d)(xd,yd)为:
xd=x+x⋅δrr,yd=y+y⋅δrr x_d = x + x \cdot \frac{\delta r}{r}, \quad y_d = y + y \cdot \frac{\delta r}{r} xd=x+xrδr,yd=y+yrδr
或更精确地:
xd=x(1+k1r2+k2r4+k3r6),yd=y(1+k1r2+k2r4+k3r6) x_d = x (1 + k_1 r^2 + k_2 r^4 + k_3 r^6), \quad y_d = y (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) xd=x(1+k1r2+k2r4+k3r6),yd=y(1+k1r2+k2r4+k3r6)

对于鱼眼专用模型,如等距鱼眼模型,投影关系为:
θ=arctan⁡(x2+y2z),rd=fθ \theta = \arctan\left(\frac{\sqrt{x^2 + y^2}}{z}\right), \quad r_d = f \theta θ=arctan(zx2+y2 ),rd=fθ
其中(x,y,z)(x, y, z)(x,y,z)为3D点在相机坐标系下的归一化坐标。逆校正时,从rdr_drdθ=rd/f\theta = r_d / fθ=rd/f,然后转换为无畸变ru=ftan⁡θr_u = f \tan \thetaru=ftanθ(假设目标为针孔模型)。

切向畸变模型

切向畸变(Tangential Distortion)由镜头不对称引起:
δxt=2p1xy+p2(r2+2x2),δyt=p1(r2+2y2)+2p2xy \delta x_t = 2 p_1 x y + p_2 (r^2 + 2 x^2), \quad \delta y_t = p_1 (r^2 + 2 y^2) + 2 p_2 x y δxt=2p1xy+p2(r2+2x2),δyt=p1(r2+2y2)+2p2xy
其中p1,p2p_1, p_2p1,p2为切向系数。完整畸变坐标:
xd=x+δxr+δxt,yd=y+δyr+δyt x_d = x + \delta x_r + \delta x_t, \quad y_d = y + \delta y_r + \delta y_t xd=x+δxr+δxt,yd=y+δyr+δyt

鱼眼投影的完整几何模型

根据Schwalbe等人的模型,鱼眼投影的理想方程为:
x′=2R⋅π2⋅arctan⁡ ⁣(XC2+YC2ZC)⋅YCXC2+YC2+ZC2+dx+xH x' = 2R \cdot \frac{\pi}{2} \cdot \frac{\arctan\!\left(\tfrac{\sqrt{X_C^{2} + Y_C^{2}}}{Z_C}\right) \cdot Y_C} {\sqrt{X_C^{2} + Y_C^{2} + Z_C^{2}}} + d_x + x_H x=2R2πXC2+YC2+ZC2 arctan(ZCXC2+YC2 )YC+dx+xH

y′=2R⋅π2⋅arctan⁡ ⁣(XC2+YC2ZC)⋅XCXC2+YC2+ZC2+dy+yH y' = 2R \cdot \frac{\pi}{2} \cdot \frac{\arctan\!\left(\tfrac{\sqrt{X_C^{2} + Y_C^{2}}}{Z_C}\right) \cdot X_C} {\sqrt{X_C^{2} + Y_C^{2} + Z_C^{2}}} + d_y + y_H y=2R2πXC2+YC2+ZC2 arctan(ZCXC2+YC2 )XC+dy+yH

其中(XC,YC,ZC)(X_C, Y_C, Z_C)(XC,YC,ZC)为相机坐标系下3D点,RRR为图像半径(类似于焦距),(xH,yH)(x_H, y_H)(xH,yH)为主点,dx,dyd_x, d_ydx,dy为畸变多项式。

坐标变换(从世界坐标到相机坐标):
XC=r11(X−X0)+r21(Y−Y0)+r31(Z−Z0) X_C = r_{11}(X - X_0) + r_{21}(Y - Y_0) + r_{31}(Z - Z_0) XC=r11(XX0)+r21(YY0)+r31(ZZ0)
YC=r12(X−X0)+r22(Y−Y0)+r32(Z−Z0) Y_C = r_{12}(X - X_0) + r_{22}(Y - Y_0) + r_{32}(Z - Z_0) YC=r12(XX0)+r22(YY0)+r32(ZZ0)
ZC=r13(X−X0)+r23(Y−Y0)+r33(Z−Z0) Z_C = r_{13}(X - X_0) + r_{23}(Y - Y_0) + r_{33}(Z - Z_0) ZC=r13(XX0)+r23(YY0)+r33(ZZ0)
rijr_{ij}rij为旋转矩阵元素,(X0,Y0,Z0)(X_0, Y_0, Z_0)(X0,Y0,Z0)为投影中心。

2. 相机标定过程

标定是传统方法的核心,用于估计内参(f,xH,yH,Rf, x_H, y_H, Rf,xH,yH,R)和畸变参数(ki,pik_i, p_iki,pi)。常用Zhang标定法(基于棋盘格)。

步骤详解
  1. 准备标定板:使用黑白棋盘格(Checkerboard),尺寸已知(如每个方格20mm)。拍摄多张(10-20张)不同角度的图像,确保覆盖图像全区域,尤其是边缘(鱼眼畸变严重处)。

  2. 角点检测:在每张图像中检测棋盘格角点。使用OpenCV的findChessboardCorners函数,得到图像坐标(ui,vi)(u_i, v_i)(ui,vi)

  3. 世界坐标建立:为每个角点分配3D世界坐标(Xw,Yw,Zw=0)(X_w, Y_w, Z_w=0)(Xw,Yw,Zw=0),以标定板平面为参考。

  4. 参数优化:使用最小二乘法求解投影方程。目标函数为重投影误差:
    E=∑i[(ui−u^i)2+(vi−v^i)2] E = \sum_{i} \left[ (u_i - \hat{u}_i)^2 + (v_i - \hat{v}_i)^2 \right] E=i[(uiu^i)2+(viv^i)2]
    其中u^i,v^i\hat{u}_i, \hat{v}_iu^i,v^i为基于当前参数的预测坐标。通过Levenberg-Marquardt算法迭代优化内参和畸变参数。

  5. 鱼眼专用标定:对于鱼眼,使用OpenCV的fisheye.calibrate函数,支持等距模型。输入多张图像,输出fx,fy,cx,cy,k1,k2,k3,k4f_x, f_y, c_x, c_y, k_1, k_2, k_3, k_4fx,fy,cx,cy,k1,k2,k3,k4

  6. 验证:计算重投影误差,应小于1像素。绘制畸变曲线验证模型准确性。

数学推导:逆校正步骤

校正时,对每个像素(ud,vd)(u_d, v_d)(ud,vd)

  1. 转换为归一化坐标:xd=(ud−cx)/fxx_d = (u_d - c_x)/f_xxd=(udcx)/fx, yd=(vd−cy)/fyy_d = (v_d - c_y)/f_yyd=(vdcy)/fy
  2. 计算rd=xd2+yd2r_d = \sqrt{x_d^2 + y_d^2}rd=xd2+yd2
  3. 求解无畸变rur_uru:通过逆多项式迭代或近似:
    ru=rd/(1+k1rd2+k2rd4+k3rd6) r_u = r_d / (1 + k_1 r_d^2 + k_2 r_d^4 + k_3 r_d^6) ru=rd/(1+k1rd2+k2rd4+k3rd6)
    (对于鱼眼,可能结合投影:θ=rd/f\theta = r_d / fθ=rd/f, ru=ftan⁡θr_u = f \tan \thetaru=ftanθ)。
  4. 角度KaTeX parse error: Undefined control sequence: \atan at position 8: \phi = \̲a̲t̲a̲n̲2(y_d, x_d)
  5. 无畸变坐标:xu=rucos⁡ϕx_u = r_u \cos \phixu=rucosϕ, yu=rusin⁡ϕy_u = r_u \sin \phiyu=rusinϕ
  6. 图像坐标:u=fxxu+cxu = f_x x_u + c_xu=fxxu+cx, v=fyyu+cyv = f_y y_u + c_yv=fyyu+cy
  7. 使用双线性插值从原图像采样u,vu, vu,v处的像素值。

此过程可通过OpenCV的undistortfisheye.undistortImage实现。注意:鱼眼校正可能导致图像拉伸,需考虑裁剪或填充。

3. 优缺点

优点:精确、可解释、计算高效。缺点:需精确标定,对镜头变化敏感;不适用于未知镜头。

神经网络方法

神经网络方法(Deep Learning Methods)将畸变校正视为图像到图像的映射问题,利用CNN等学习复杂非线性关系。无需显式模型,适用于各种鱼眼镜头,但需训练数据。

1. 原理与数学基础

核心是学习函数F:Id→IuF: I_d \rightarrow I_uF:IdIu,其中IdI_dId为畸变图像,IuI_uIu为无畸变图像。使用监督学习,最小化损失:
L=∥Iu−I^u∥1+λ∥∇I^u∥1 L = \| I_u - \hat{I}_u \|_1 + \lambda \| \nabla \hat{I}_u \|_1 L=IuI^u1+λ∥∇I^u1
其中I^u=F(Id)\hat{I}_u = F(I_d)I^u=F(Id)∥⋅∥1\| \cdot \|_11为L1范数,∇\nabla为梯度(平滑项)。

对于自监督方法,使用几何约束如光流一致性:
Lself=∥F(Id)−Iref∥22+∥flow(Id,F(Id))∥22 L_{self} = \| F(I_d) - I_{ref} \|_2^2 + \| \text{flow}(I_d, F(I_d)) \|_2^2 Lself=F(Id)Iref22+flow(Id,F(Id))22
其中flowflowflow为光流估计。

2. 常见网络架构

2.1 卷积神经网络(CNN)

CNN通过卷积层提取特征,直接输出校正图像。

  • 基本结构:输入层 → 多层Conv+ReLU+Pool → 全连接或上采样 → 输出层。
  • 示例:Rong et al. (2016)的CNN框架,使用合成数据集训练径向畸变校正。网络预测畸变参数kik_iki,然后应用几何校正。
  • 数学:卷积操作(I∗K)(x,y)=∑m,nI(x+m,y+n)K(m,n)(I * K)(x,y) = \sum_{m,n} I(x+m, y+n) K(m,n)(IK)(x,y)=m,nI(x+m,y+n)K(m,n),其中KKK为内核。
  • 训练:使用配对数据集(如FISHEYE数据集),Adam优化器,学习率10−410^{-4}104,批量大小32。损失:MSE + SSIM。

高级变体:

  • RotInvMTL (Arsenali et al., 2019):多任务学习网络,同时进行语义分割和畸变校正。架构:Encoder(ResNet-like)+ Decoder,支持实时处理。
  • ANAFNet (Hao et al., 2023):注意力机制的无激活网络,用于去模糊鱼眼图像。注意力模块:KaTeX parse error: Undefined control sequence: \softmax at position 20: …ntion(Q,K,V) = \̲s̲o̲f̲t̲m̲a̲x̲(QK^T / \sqrt{d…
2.2 生成对抗网络(GAN)

GAN通过生成器G和判别器D对抗训练,提高图像质量。

  • 结构:G: 畸变图像 → 无畸变图像;D: 区分真假无畸变图像。
  • 损失:
    LG=E[log⁡(1−D(G(Id)))]+λLperc L_G = \mathbb{E}[\log(1 - D(G(I_d)))] + \lambda L_{perc} LG=E[log(1D(G(Id)))]+λLperc
    LD=E[log⁡D(Iu)]+E[log⁡(1−D(G(Id)))] L_D = \mathbb{E}[\log D(I_u)] + \mathbb{E}[\log(1 - D(G(I_d)))] LD=E[logD(Iu)]+E[log(1D(G(Id)))]
    LpercL_{perc}Lperc为感知损失(VGG特征)。
  • 示例:DR-GAN (Liao et al., 2020):条件GAN,用于径向畸变校正。首次端到端对抗框架,训练于合成鱼眼图像对。生成器基于U-Net,判别器为PatchGAN。
  • DG-Net (Thapa et al., 2021):畸变图引导的GAN,用于水下鱼眼恢复。畸变图MMM输入G:I^u=G(Id,M)\hat{I}_u = G(I_d, M)I^u=G(Id,M)

训练步骤:

  1. 生成合成数据集:使用Blender渲染畸变/无畸变对,或采集真实鱼眼图像并几何校正作为ground truth。
  2. 预训练G最小化L1损失。
  3. 交替训练G和D,迭代100-200 epochs。
  4. 评估:PSNR/SSIM > 30dB。
2.3 编码器-解码器架构

如U-Net:Encoder压缩特征,Decoder重建图像,跳跃连接保留细节。

  • 示例:Neural Ray Surfaces (NRS, Vasiljevic et al., 2020):CNN表示像素射线,近似鱼眼模型,用于深度估计。每个像素学习射线方向d⃗=MLP(pixel)\vec{d} = MLP(pixel)d =MLP(pixel)
  • Progressively Complementary Network (Yang et al., 2021):特征级校正网络,分结构校正和内容重建。使用外观流(Appearance Flow):
    Flow=arg⁡min⁡∑∣Iu(p)−Id(p+flow(p))∣ Flow = \arg\min \sum |I_u(p) - I_d(p + flow(p))| Flow=argminIu(p)Id(p+flow(p))
2.4 模型免费校准

如Yin et al. (2022)的神经网络立体鱼眼校准:CNN直接预测畸变参数或映射,无需几何模型。输入单目/双目鱼眼图像,输出 rectified 图像。

3. 训练与应用要点

  • 数据集:FISHEYE101、合成数据集(使用COLMAP生成)。对于自监督,使用城市街道视频(无需ground truth)。
  • 实现:PyTorch/TensorFlow。示例代码:加载预训练DR-GAN,输入鱼眼图像,输出校正结果。
  • 优化:数据增强(旋转、翻转);迁移学习从ImageNet预训练。
  • 实时性:轻量网络如MobileNet backbone,实现30FPS on GPU。

优缺点:优点:泛化强、处理复杂场景;缺点:黑箱、需GPU、数据依赖。

两种方法的比较

方面 传统几何方法 神经网络方法
原理 基于物理模型和参数估计 数据驱动学习映射
公式 显式多项式/投影方程 隐式网络权重
数据需求 少(几张标定图像) 多(数千对图像)
精度 高(已知镜头) 高(训练充分)
计算 低(CPU实时) 高(GPU加速)
适用 标准鱼眼 任意畸变/未知镜头

传统方法适合精确工程应用,神经网络适合AI集成系统。

结论

鱼眼畸变校正是计算机视觉的基础任务。传统几何方法提供可解释的数学框架,便于理解和实现;神经网络方法则代表未来趋势,能处理更复杂场景。实际应用中,可结合两者:用几何预校正+网络细化。建议读者使用OpenCV实验传统方法,PyTorch实现GAN。

最后

煮啵实在一个鱼眼展开图中涉及到畸变校正这一部分,最后把煮啵采用的是传统几何方法,因为煮啵要做立体匹配,对于精度的要求较高,同时煮啵在进行测试的时候发现,使用深度学习的方法进行畸变校正的时候会出现基线对不齐的情况,这对于后续的匹配工作是不可容忍的问题,而且基于传统的方法精度往往能达到亚像素级别因此煮啵选择了该方法,如果您仅仅是考虑进行语义分割等方向,深度学习也是一个很好的方法,但是建议您在进行训练的时候使用多相机数据进行训练,因为畸变是一个硬件绑定较强的问题,多相机训练可以提升您模型的泛化能力,如果您是要针对硬件进行深度定制的话,单相机训练会更好!


网站公告

今日签到

点亮在社区的每一天
去签到