Matlab相机校准 - 纠正镜头失真

时间:2013-11-30 15:45:03

标签: image-processing computer-vision matlab matlab-cvst

在Matlab的计算机视觉系统工具箱中,Correct lens distortion使用了三种类型的插值方法。

输入图像上使用的函数的插值方法。 interp输入插值方法可以是字符串,“最近”,“线性”或“立方”。

我的问题是:'最近','线性'或'立方'之间有什么区别?哪一个用“张”和“Heikkila,J和O. Silven”方法实现。

2 个答案:

答案 0 :(得分: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。

HEIKKILA,Janne; SILVEN,Olli。具有隐式图像校正的四步相机校准程序。 In: Computer Vision and Pattern Recognition,1997。Proceedings。,1997 IEEE Computer Society Conference on 。 IEEE,1997。p。 1106年至1112年。

我搜索了单词" interpolation"在两个pdf文档ZhangHeikkila and Silven中,我没有找到关于他们使用的插值方法的任何直接陈述。

据我所知,一般来说,摄像机校准方法涉及如何估计内在,外在和镜头失真参数(所有这些参数都在Matlab的输入参数cameraParameters undistortImage dst(x,y) = src(f_x(x,y), f_y(x,y))内。 1}}功能);插值方法是另一个问题的一部分,即几何图像变换的问题"。

我引用了OpenCV's page Geometric Image Transformation(我略微修改了原文,省略了一些细节并添加了一些定义,我假设您正在使用灰度图像):

  

本节中的功能执行各种几何   二维图像的变换。它们不会改变图像内容   变形像素网格并将此变形网格映射到目标   图片。实际上,为了避免采样伪像,映射完成   从目的地到源的相反顺序。也就是说,每个人   目标图像的像素(x,y),函数计算   源图像中相应“施主”像素的坐标和   复制像素值:

     

dst(x,y)

     

,其中

     

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

     

x是位于源图像中的行y和列f_x的像素的灰度值

     

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

     

x是一个将行y和列(x,y)映射到新列的函数,它只使用坐标而不是灰度级。

     

几何变换的实际实现,来自   最通用的remap()和最简单,最快的调整大小()   ,需要用上面的公式解决两个主要问题:

     

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

     

•像素插值   值。通常f_y(x,y)<f_x, f_y>是浮点数。这个   意味着(f_x(x,y), f_y(x,y))可以是仿射或   透视变换,或径向透镜畸变校正,和   等等。因此,需要在小数坐标处的像素值   检索。在最简单的情况下,坐标可以是圆形的   到最近的整数坐标和相应的像素即可   用过的。这称为最近邻插值。但是,一个   使用更复杂的方法可以获得更好的结果   插值方法,其中多项式函数适合某些   计算像素(f_x(x,y), f_y(x,y))的邻域,然后是   'nearest'处的多项式的值被视为。{1}   内插像素值。在OpenCV中,您可以选择几种   插值方法。有关详细信息,请参阅resize()。

对于&#34; soft&#34;引言也参见例如Cambridge in colour - DIGITAL IMAGE INTERPOLATION

所以,让我们说你需要x = 20.2 y = 14.7的像素灰度级,因为x和y是一个小数部分与零不同的数字,你需要发明&#34; (以某种方式计算)灰度级。在最简单的情况下('linear'插值),您只需说(20.2,14.7)处的灰度级是您在(20,15)处检索的灰度级,它被称为&#34;最接近&#34;因为20是最接近20.2的整数值,15是最接近14.7的整数值。

在(bi)'cubic'插值中,您将使用(20,14),(20,15)处的四个像素的灰度级组合计算(20.2,14.7)处的值( 21,14),(21,15);有关如何计算组合的详细信息,请参阅具有Wikipedia pagea numeric example

(bi){{1}}插值考虑16个像素的组合以计算(20.2,14.7)处的值,请参阅Wikipedia page

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

答案 1 :(得分:0)

插值方法实际上与相机校准无关。每次对图像应用几何变换(例如旋转,重新调整大小或失真补偿)时,新图像中的像素将对应于旧图像的像素之间的点。所以你必须以某种方式插入他们的价值观。

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

interp2函数的文档中给出了对这些插值方法的详细描述。

最后,为了澄清,undistortImage功能在计算机视觉系统工具箱中。