当前位置:  开发笔记 > 编程语言 > 正文

MATLAB:检测灰度图像中的非连续垂直条纹

如何解决《MATLAB:检测灰度图像中的非连续垂直条纹》经验,为你挑选了2个好方法。

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

谢谢!

在此输入图像描述



1> Photon..:

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

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);

这导致图像的以下1D信号.

初始处理的结果

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



2> Shai..:

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);

并且heres'结果(您可能想要更改阈值并查看它如何影响结果):
在此输入图像描述

估计的"DC",dc_est看起来像:

在此输入图像描述


如果您正在进行更精细的冒险,我建议您探索这项工作:I.Horev,B.Nadler,E.Arias-Castro,M.Galun,R.Basri 检测计算预算中的长边:一个子线性方法 (SIAM 2015).该方法旨在在噪声强度图像中找到这些难以捉摸的边缘和脊.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有