【问题标题】:Image recognition of well defined but changing angle image定义清晰但角度变化的图像的图像识别
【发布时间】:2014-06-17 14:44:36
【问题描述】:

问题

我有一张从摆动的车辆上拍摄的照片。为简单起见,我将其转换为黑白图像。示例如下:

图像显示了高强度回波,其中有一个图案,发现所有有效图像都以红色圈出。该图像可以根据车辆的旋转从多个角度拍摄。另一个例子在这里:

这里的目的是尝试识别存在这种模式的图片单元格。

目前的方法

到目前为止,我已经尝试了几种方法,我正在使用 Matlab 进行测试,但最终将在 C++ 中实现。希望该算法具有时间效率,但是,我对任何建议都感兴趣。

SURF(加速鲁棒特征)特征识别

我尝试了 SURF 的默认 matlab 实现来尝试查找特征。 Matlab SURF 能够识别 2 个示例中的特征(与上述不同),但是无法识别常见的:

我知道这些点是不同的,但模式仍然有些可识别。我尝试了多组图片,几乎没有共同点。从阅读有关 SURF 的内容来看,无论如何它似乎对倾斜图像并不稳健。 也许这里有一些关于预处理的建议?

模板匹配

因此尝试了模板匹配,但绝对不是应用程序的理想选择,因为它不适合缩放或倾斜更改。我愿意接受预处理想法以解决偏差。这可能很容易,关于图片的额外信息的一些讨论将在下面提供。

现在让我们研究模板匹配:假设我们有以下两个图像作为模板和当前图像:

模板选自最前向的图像之一。并在非常相似的图像上使用它,我们可以匹配位置:

但是(并且有些明显)如果我们将图片更改为不同的角度,它将无法正常工作。我们当然期望这是因为模板不再像图像中的图案:

所以我们显然也需要在这里进行一些预处理工作。

霍夫线和 RANSAC

霍夫线和 RANSAC 可能能够为我们识别线,但我们如何获得图案位置?

其他我还不知道的

我对图像处理领域还很陌生,所以我很想听听任何其他适合这个简单而困难的图像记录问题的技术。

传感器以及它将如何帮助预处理

传感器是一个 3d 激光,它已被转换为该实验的图像,但仍保留其距离信息。如果我们绘制从 0 到 255 的距离,我们会得到以下图像:

打火机在更远的地方。这绝对可以帮助我们对齐图像,对最佳方式的一些想法?。到目前为止,我已经想到了诸如计算非 0 单元格的法线之类的事情,我们还可以进行某种梯度下降或最小二乘拟合,使距离差为 0,这样可以对齐图像,使其总是笔直的。问题是纯白色条纹更远?也许我们可以把它分割出来?我们是在我们的算法上构建算法,所以我们需要小心,这样它就不会变成一个怪物。

任何帮助或想法都会很棒,我很乐意研究任何认真的答案!

【问题讨论】:

  • 模式的一致性如何?如果每个图像的大小、像素数、独立像素数等...大致相同,您可以尝试使用具有这些标准的简单滑动窗口函数。
  • @Ghaul 是的,那是模板匹配。问题是模板匹配不能很好地处理倾斜的图像。
  • 这取决于匹配标准,这就是为什么我建议您尝试一些对旋转更稳健的相似性度量,例如模式中未连接区域的数量。从您上面的图片来看,该模式似乎有 10-13 个彼此靠近的非连接区域。这样的集群有多常见?如果它们很少见,一个简单地计算非连接区域数量的滑动窗口就可以识别出这种模式。
  • 如果你上传一些测试图片我可以自己尝试并写一个正确的答案。

标签: c++ matlab image-processing matlab-cvst


【解决方案1】:

我愿意:

  1. 分段图片

    通过Z 坐标(与相机/LASER 的距离),其中Z 坐标跳跃超过阈值 对象和背景之间存在边界(如果相邻的Z 值很大或超出范围)或另一个对象(如果相邻Z 值不同)或自身(如果相邻Z 值不同但可以连接到自身)。这将为您提供一组对象

  2. 与查看器对齐

    计算每个对象的边界点(最外边缘),通过atan2 计算方向旋转回面对相机垂直。

    您的图像看起来像标志标记,因此在这种情况下,围绕 Y 轴旋转就足够了。您还可以将对象的大小缩放到预定义的距离(如果目标始终是相同的大小)

    您需要知道相机系统的FOV,并为此校准了Z 轴。

  3. 现在尝试识别对象

    这里使用你现在所拥有的,也可以添加过滤器,比如跳过大小或纵横比不匹配的对象......你可以使用 DFT/DCT 或比较归一化/均衡图像的直方图等. ...

[PS]

对于特征使用 BW-Bit 图像不是一个好主意,因为您丢失了太多信息。改用灰度或彩色(灰度通常就足够了)。我通常在兴趣点周围添加一些小区域(具有很少不同的半径)的简化直方图,这些直方图在旋转时是不变的。

【讨论】:

  • 听起来不错。在第 2 步中,您建议如何找到旋转角度以便我可以旋转图像?
  • @Ben 不知道目标对象的形状,但如果它是平面的,则找到图像的边界框,并得到最接近边界框不同边缘的 3 个点。计算它们形成的三角形的法线及其坐标为您提供所需的所有角度信息。您还可以找到彼此最远的 3 个点(按 Z 排序点并取最近、最远和中间)。法线通过简单的向量乘法计算。不要忘记将法线归一化为单位向量大小,然后坐标是该轴上角度的 cos
【解决方案2】:

我认为 SURF 不是在这里使用的正确方法。 SURF 设计用于处理常规的 2D 强度图像,但您在这里拥有的是 3D 点云。有一种用于点云配准的算法称为迭代闭点 (ICP)。 MATLAB File Exchange 上有几种实现方式,如this one

编辑 计算机视觉系统工具箱现在(截至 R2015b 版本)包括点云处理功能。点云配准和拼接见this example

【讨论】:

  • 感谢您的建议,ICP 是最终目标,我们已经在使用它。虽然它是为了精细注册,但这里的重点是获得一个粗略的解决方案,以便它可以播种 ICP。
【解决方案3】:

看一下对数极坐标模板匹配,它是旋转和尺度不变的: http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf

【讨论】:

    【解决方案4】:

    这与我们在实验室中解决的识别手绘字符的问题非常相似,因为目标图案是二进制的、低分辨率的,并且容易变形。

    根据我们的经验,我认为 SURF 不是正确的方法,正如在其他地方指出的那样,这假设连续的 2D 图像不是二进制的,并且会在您的情况下中断。模板匹配也不适用于这种二值图像 - 您的像素只需稍微错位即可返回低匹配分数,因为像素值中没有局部空间相干性来减轻窗口的轻微错位。

    我们的方法是在这种情况下尝试将二值图像“转换”为连续或“灰度”图像。例如见下图:

    这些转换是通过运行一阶导数边缘检测器进行的,例如卷积 3x3 模板 [0 0 0 ; 1 0 -1 ; 0 0 0] 并在图像 I 上转置以获得 dI/dx 和 dI/dy。 在任何像素处,我们都可以从这两个字段中获得边缘方向 atan2(dI/dy,dI/dx)。我们将此信息视为在草图像素(您的问题中的白色像素)处已知而在黑色像素处未知。然后,我们使用拉普拉斯平滑假设从白色像素中推断黑色像素的值。详情在本文中:

    http://personal.ee.surrey.ac.uk/Personal/J.Collomosse/pubs/Hu-CVIU-2013.pdf

    如果这是一个主要的麻烦,您可以尝试使用距离变换,在 Matlab 中使用 bwdist 很方便,但它不会给出准确的结果。

    现在我们有了“连续”图像(根据上面图像的右侧列)。灰度模式对图像中的局部结构进行编码,并且更适合基于梯度的描述符,如 SURF 和模板匹配。

    我的直觉是首先尝试模板匹配,但由于这是仿射敏感的,我会一直使用 HOG/Bag of Visual words 方法,就像我们上面的论文一样,来匹配这些模式。

    我们发现这条管道可以在基于草图的形状识别中提供最先进的结果,我的博士生已经成功地在后续工作中使用了匹配象形文字,所以我认为它可以很好地处理这种模式您在示例图像中摆姿势。

    【讨论】:

      【解决方案5】:

      我想出了以下程序来分割区域,并希望使用模板匹配找到感兴趣的模式。我添加了一些 cmets 和图形标题来解释流程和一些生成的图像。希望对您有所帮助。

      im = imread('sample.png');
      gr = rgb2gray(im);
      bw = im2bw(gr, graythresh(gr));
      
      bwsm = imresize(bw, .5);
      
      dism = bwdist(bwsm);
      dismnorm = dism/max(dism(:));
      figure, imshow(dismnorm, []), title('distance transformed')
      
      eq = histeq(dismnorm);
      eqcl = imclose(eq, ones(5));
      figure, imshow(eqcl, []), title('histogram equalized and closed')
      
      eqclbw = eqcl < .2; % .2 worked for samples given
      eqclbwcl = imclose(eqclbw, ones(5));
      figure, imshow(eqclbwcl, []), title('binarized and closed')
      
      filled = imfill(eqclbwcl, 'holes');
      figure, imshow(filled, []), title('holes filled')
      
      % -------------------------------------------------
      % template
      tmpl = zeros(16);
      tmpl(3:4, 2:6) = 1;tmpl(11:15, 13:14) = 1;
      tmpl(3:10, 7:14) = 1;
      
      st = regionprops(tmpl, 'orientation');
      tmplAngle = st.Orientation;
      % -------------------------------------------------     
      
      lbl = bwlabel(filled);
      stats = regionprops(lbl, 'BoundingBox', 'Area', 'Orientation');
      figure, imshow(label2rgb(lbl), []), title('labeled')
      
      % here I just take the largest contour for convenience. should consider aspect ratio and any
      % other features that can be used to uniquely identify the shape
      [mx, id] = max([stats.Area]);
      mxbb = stats(id).BoundingBox;
      
      % resize and rotate the template
      tmplre = imresize(tmpl, [mxbb(4) mxbb(3)]);
      tmplrerot = imrotate(tmplre, stats(id).Orientation-tmplAngle);
      
      xcr = xcorr2(double(filled), double(tmplrerot));
      figure, imshow(xcr, []), title('template matching')
      

      调整大小的图像:

      分段:

      模板匹配:

      【讨论】:

        【解决方案6】:

        鉴于较差的图像质量(低分辨率 + 二值化),我更喜欢模板匹配,因为它基于简单的全局相似性度量,并且不会尝试进行任何特征提取(您的样本中没有可靠的特征) .

        但是您需要应用带有旋转的模板匹配。一种方法是预先计算模板的旋转实例,对每个角度执行匹配并保持最佳状态。

        可以在比较中整合深度信息(如果有帮助的话)。

        【讨论】:

        • 听起来不错,这对时间复杂度有什么影响,我知道模板匹配算法是 O(n*m) 其中 n 是图像中的像素数,m 是图像中的像素数模板。你认为这会花费更长的时间吗?你认为这将包括多少轮换?另外,您建议如何处理图像的歪斜,记住它是从不同角度拍摄的?
        • 复杂度将增加到 O(n.m.r),其中 r 是旋转次数。对于这种情况,每 5° 就足够了。我建议忽略偏斜。除非它可以很大:在这种情况下,由于图像质量差,这个应用程序是不可行的。
        猜你喜欢
        • 2013-05-26
        • 2015-04-27
        • 2017-10-27
        • 2013-07-27
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多