1. 校正后的图像宽度(w)和高度(h)如何确定?
2. 为什么将校正图的大小设置为3*R后的校正效果如此之差?(见原博的第三幅图)

问题1:校正后的图像宽度(w)和高度(h)如何确定?

这个问题应该从鱼眼镜头成像的几何模型入手

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_博客


这里假设鱼眼镜头的成像面是曲面π1,而校正图像(投射投影)的成像面是平面π。因此可以把鱼眼镜头图像校正算法理解作由曲面π1和平面π的几何关系来对鱼眼图像像素做位置的映射,即求出点q1和q的纵坐标关系,进而得到每个像素坐标关系,即论文中的公式(11)(12)。

那如何确定鱼眼图像和校正图像之间的尺寸关系?

应该通过几何关系来确定鱼眼图与校正图之间的尺寸关系。设q1点是离鱼眼图像中心最远距离的点L0(图中红色箭头表示),通过几何关系计算出q点离校正图像中心最远的距离L1(图中绿色箭头表示)。那么L0与L1之比就是鱼眼图像和校正图像的尺寸之比。由于论文使用的是向后映射(由校正图像坐标反过去求鱼眼图像坐标,并将对应的像素填充到当前校正图像素坐标中),即先假设校正图像尺寸(w,和h ),这怎么可以假设?明明是可以计算出来的!

我这里计算下。由原论文公式(3)和公式(1),

在鱼眼图像中:L0=f*ω

在校正图像中:L1=f*tanω

消掉ω ,得: L1=f*tan(L0/f)

这样,得到比例 s=L1/L0,便是校正图像和鱼眼图像尺寸之比。

我这里使用的鱼眼图像尺寸1280*1280,几何中心在(644,643),R=634 ,f=403.6,在一个圆中离圆心最远的点就在圆上,这个距离就是半径。

故L0=634

L1=f*tan(L0/f)= f*tan(π/2)=+∞

原因是入射角接近90°时(可以想象上图物点p无限往上移),这时的校正图像将会接近无限大(微笑)。所以我觉得这里可以认为我们只能是人为的去取一个合适的尺寸比例参数,因为反正你要取大了,效果也渣的不行了,想要完美提取出鱼眼边缘严重畸变处隐藏的信息是不可能的。我做了实验分别取1倍,2倍,还有4四倍的效果。顺便纠正原博主的在做3*R实验的错误。

问题二:为什么将校正图的大小设置为3*R后的校正效果如此之差?(见原博的第三幅图)
博主在尝试设校正图为3倍鱼眼图半径r做的结果如下图所示:

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_博客_02

问题如下:

这里附上原博主的代码:

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_算法_03


注:图片标注有点错误,感谢:@chensonglu 同学指正,上图第二个箭头的注明应改为“这里应该把等式右边的+x0,+y0,改为+R”

因此博主的问题出在,鱼眼图像中心和校正图中心应该是两个不同的坐标,两幅图的尺寸不一,图像中心坐标当然不一样。虽然论文中有鱼眼图和校正图“共心 ”,但涉及到坐标计算的时候,;两幅尺寸不一的图,在同一坐标系下,要用不同的坐标表示其中心。如下图所示:

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_算法_04


最后,我在博主代码的基础上做了如上述的修改,使用自己的鱼眼图像分别校正出,1:1,1:2,和1:4的校正图:

原图:

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_技术_05


1:1

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_博客_06


可以看出丢失了很多边缘信息

1:2

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_源代码下载_07


可以看出比起图一多了很多信息

1:4

python鱼眼镜头去畸变 鱼眼镜头畸变校正软件_技术_08