4

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

谢谢!

enter image description here

回答

10

Photon的回答非常好:他建议沿着垂直边缘过滤器捕捉条纹的纵向边缘。然而,如果你有兴趣定位条纹本身而不是它们的边缘,你可能会考虑一个稍微不同的方法:

我建议首先消除“DC”组件,以便条纹将“流行out“的大致不变的背景,然后使用垂直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)。这种方法的目的是在嘈杂的强度图像中找到这些难以捉摸的边缘和脊。

+0

你能不能也显示'dc_est'? – kkuilla

+0

@kkuilla请参阅我的更新。 – Shai

10

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

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

导致的图像下面的一维信号。

Result of initial processing

然后,您可以找到您对这个信号的权门槛,并使用该指数作为线位置。