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

时间:2016-01-06 06:16:36

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

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

谢谢!

enter image description here

2 个答案:

答案 0 :(得分:11)

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

span {display: inline-block}

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

Result of initial processing

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

答案 1 :(得分:11)

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

而且他是'结果(您可能想要更改阈值并查看它对结果的影响):
enter image description here

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

enter image description here

如果您正在进行更精细的冒险,我建议您探索这项工作: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)。该方法旨在在噪声强度图像中找到这些难以捉摸的边缘和脊。