【问题标题】:Matlab Camera Calibration - Correct lens distortionMatlab相机校准 - 校正镜头失真
【发布时间】:2013-11-30 15:45:03
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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 and Silven这两个pdf文档中搜索了“插值”这个词,没有找到任何关于他们使用的插值方法的直接说明。

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

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

    本节中的函数执行各种几何 二维图像的变换。他们不改变图像内容,但 变形像素网格并将这个变形的网格映射到目标 图片。事实上,为了避免采样伪影,映射是在 相反的顺序,从目的地到源。也就是说,对于每个 目标图像的像素 (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_x 是将行 x 和列 y 映射到新行的函数,它只使用坐标而不是灰度。

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

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

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

    • 像素插值 价值观。通常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 colour - 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);有关如何计算组合的详细信息,请参阅具有 a numeric exampleWikipedia page

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多