答案 0 :(得分:11)
您可以使用简单的水平过滤器来收集有关这些行的信息:
span {display: inline-block}
这会导致图像的以下1D信号。
然后,您可以在此信号上找到合适的阈值,并使用索引作为行位置。
答案 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);
而且他是'结果(您可能想要更改阈值并查看它对结果的影响):
估计的" 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)。该方法旨在在噪声强度图像中找到这些难以捉摸的边缘和脊。