在附图中,存在周期性垂直条纹,其沿x轴是随机的并且沿其y轴的强度变化.
有关如何检测这些的任何建议?
理想情况下,我想通过显示条纹的二进制图像的输出来检测这些(我想它最终会看起来像条形码).
谢谢!
您可以使用简单的水平过滤器来收集有关这些行的信息:
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信号.
然后,您可以在此信号上找到适合您的阈值,并使用索引作为线位置.
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).该方法旨在在噪声强度图像中找到这些难以捉摸的边缘和脊.