【问题标题】:MATLAB: detecting non-continuous vertical streaks in greyscale imageMATLAB:检测灰度图像中的非连续垂直条纹
【发布时间】:2016-04-10 04:04:43
【问题描述】:

在附加的图像中,有周期性的垂直条纹,它们沿 x 轴是随机的,并且沿 y 轴的强度会有所不同。
有关如何检测这些的任何建议?
理想情况下,我想通过输出显示条纹的二进制图像来检测这些(我想它最终会看起来像条码)。

谢谢!

【问题讨论】:

    标签: matlab image-processing computer-vision image-segmentation edge-detection


    【解决方案1】:

    您可以使用简单的水平过滤器来收集有关这些行的信息:

    I=imread('lines.jpg');
    I=double(I)*(1.0/255.0);
    J=filter2([-1 0 1;-1 0 1;-1 0 1],I);
    s=sum(J);
    

    这会为图像生成以下一维信号。

    然后您可以在此信号上找到适合您的阈值,并将索引用作线位置。

    【讨论】:

      【解决方案2】:

      Photon 的回答非常好:他建议使用带状垂直边缘过滤器来捕捉条纹的垂直边缘
      但是,如果您对定位条纹本身而不是边缘感兴趣,您可以考虑采用稍微不同的方法:

      我建议,首先,消除“DC”分量,以便条纹会从大致恒定的背景中“弹出”,然后使用垂直的sum 来定位它们并生成蒙版。

      这是代码的草图:

      img = im2double( imread('http://i.stack.imgur.com/SqZrf.jpg') ); %// read the image
      

      使用水平过滤器来估计局部“DC”,即条纹消失的图像:

      dc_est = imfilter(img, ones(1,31)/31, 'symmetric' ); 
      

      查看图像和估计的“DC”之间的差异应该会使条纹突出并易于使用全局阈值进行阈值:

      global_thr = 0.025;
      mask = ones(size(img,1),1)*(mean(img-dc_est,1)>global_thr);
      figure; imshow(mask);
      

      结果如下(您可能想更改阈值并查看它如何影响结果):

      估计的“DC”dc_est 看起来像:


      如果您想进行更复杂的冒险,我建议您探索这项工作:I. Horev, B. Nadler, E. Arias-Castro, M. Galun, R.Basri Detection of long edges on a computational budget: a sub-linear approach (SIAM 2015)。该方法旨在在噪声强度图像中找到这些难以捉摸的边缘和脊。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-07
        • 2020-10-11
        • 2021-12-01
        • 2014-06-16
        • 1970-01-01
        • 2012-04-27
        • 2012-06-01
        • 2021-02-07
        相关资源
        最近更新 更多