2

在 Matlab 的计算机视觉系统工具箱中,有三种用于校正镜头失真的插值方法。

用于输入图像的函数的插值方法。interp 输入插值方法可以是字符串、“最近”、“线性”或“三次”。

我的问题是:“最近”、“线性”或“立方”有什么区别?哪一个在“Zhang”和“Heikkila, J, and O. Silven”方法中实现。

4

2 回答 2

1

我无法通过您在问题中写的链接访问分页(它要求输入用户名和密码),因此我假设您的链接页面与页面http://www.mathworks.it/it/的内容相同我在这里引用的help/vision/ref/undistortimage.html :

J = undistortImage(I,cameraParameters,interp)从输入图像中去除镜头畸变,I并指定要在输入图像上使用的函数的插值方法。

输入参数

I— 输入图像

cameraParameters— 用于存储相机参数的对象

interp— 插值法

'linear'(默认)| 'nearest'|'cubic'

用于输入图像的函数的插值方法。interp 输入插值方法可以是字符串、'nearest''linear''cubic'

此外,我假设您指的是这些论文:

张正友. 一种灵活的相机校准新技术。模式分析和机器智能,IEEE Transactions on,2000,22.11:1330-1334。

海基拉,珍妮;西尔文,奥利。具有隐式图像校正的四步相机校准程序。在:计算机视觉和模式识别,1997 年。Proceedings.,1997 年 IEEE 计算机学会会议。IEEE,1997 年。1106-1112。

我在ZhangHeikkila 和 Silven的两个 pdf 文档中搜索了“插值”这个词,我没有找到任何关于他们使用的插值方法的直接说明。

据我所知,一般来说,相机校准方法关注的是如何估计内在、外在和镜头畸变参数(所有这些参数都在cameraParametersMatlabundistortImage函数的输入参数中);插值方法是不同问题的一部分,即“几何图像变换”问题。

我引用了OpenCV 的几何图像转换页面(我对原始图像做了一些修改,省略了一些细节并添加了一些定义,我假设您正在使用灰度图像):

本节中的函数执行 2D 图像的各种几何变换。它们不会改变图像内容,而是使像素网格变形并将这个变形的网格映射到目标图像。事实上,为了避免采样伪影,映射是以相反的顺序完成的,从目标到源。也就是说,对于目标图像的每个像素 (x, y),函数计算源图像中相应“供体”像素的坐标并复制像素值:

dst(x,y) = src(f_x(x,y), f_y(x,y))

在哪里

dst(x,y)是目标图像中位于行x和列的像素的灰度值y

src(x,y)是源图像中位于行x和列的像素的灰度值y

f_xx是将行和列映射到新行的函数y,它只使用坐标而不是灰度。

f_yx是将行和列映射到新列的函数y,它只使用坐标而不是灰度。

几何变换的实际实现,从最通用的 remap() 到最简单最快的 resize() ,需要用上面的公式解决两个主要问题:

• 外推不存在的像素。与上一节中描述的过滤函数类似,对于某些(x,y), 或 中的一个f_x(x,y)f_y(x,y)或两者都可能落在图像之外。在这种情况下,需要使用外推法。OpenCV 提供与过滤函数相同的外推方法选择。此外,它还提供了 BORDER_TRANSPARENT 方法。这意味着目标图像中的相应像素根本不会被修改。

• 像素值的插值。通常f_x(x,y)f_y(x,y)是浮点数。这意味着<f_x, f_y>可以是仿射或透视变换,也可以是径向镜头畸变校正,等等。因此,需要检索分数坐标处的像素值。在最简单的情况下,坐标可以四舍五入到最接近的整数坐标,并且可以使用相应的像素。这称为最近邻插值。然而,通过使用更复杂的插值方法可以获得更好的结果,其中多项式函数适合计算像素的某个邻域(f_x(x,y), f_y(x,y)),然后多项式的值在(f_x(x,y), f_y(x,y))取为插值像素值。在 OpenCV 中,您可以在多种插值方法之间进行选择。有关详细信息,请参阅 resize()。

有关“软”介绍,另请参见Cambridge in color - DIGITAL IMAGE INTERPOLATION

因此,假设您需要 x=20.2 y=14.7 处的像素灰度级,因为 x 和 y 是小数部分不为零的数字,您需要以某种方式“发明”(计算)灰度级。在最简单的情况下('nearest'插值),您只需说 (20.2,14.7) 处的灰度级是您在 (20,15) 处检索到的灰度级,它被称为“最近”,因为 20 是最接近 20.2 和 15 的整数值是最接近 14.7 的整数值。

在 (bi)'linear'插值中,您将结合 (20,14)、(20,15)、(21,14)、(21, 15); 有关如何计算组合的详细信息,请参阅具有数字示例的Wikipedia 页面

(bi)'cubic'插值考虑了 16 个像素的组合,以计算 (20.2,14.7) 处的值,请参阅Wikipedia 页面

我建议您尝试所有三种方法,使用相同的输入图像,并查看输出图像的差异。

于 2013-12-01T11:04:09.823 回答
0

插值方法实际上是独立于相机标定的。每当您对图像应用几何变换(例如旋转、调整大小或失真补偿)时,新图像中的像素将对应于旧图像像素之间的点。所以你必须以某种方式插入它们的值。

“最近”意味着您只需使用最近像素的值。
“线性”表示您使用双线性插值。新像素的值是输入图像中相邻像素值的加权和,其中权重与距离成正比。'cubic' 意味着你使用双三次插值,它比双线性更复杂,但可能会给你一个更平滑的图像。

interp2函数的文档中对这些插值方法进行了很好的描述。

最后,澄清一下,该undistortImage功能位于计算机视觉系统工具箱中。

于 2013-12-06T16:40:07.013 回答