MATLAB:检测灰度图像中的非连续垂直条纹
MATLAB: detecting non-continuous vertical streaks in greyscale image
在附图中有周期性的垂直条纹,它们沿 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);
这导致图像的以下一维信号。
然后您可以在此信号上找到适合您的阈值,并使用索引作为线位置。
的回答非常好:他建议使用垂直边缘过滤器来捕获条纹的垂直 边缘 。
但是,如果您有兴趣定位条纹本身而不是它们的边缘,您可能会考虑一种稍微不同的方法:
我建议首先去掉"DC"成分,这样条纹会"pop 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);
这是结果(您可能想更改阈值并查看它如何影响结果):
估计"DC"、dc_est
长得像:
如果您想要进行更精细的冒险,我建议您探索这部作品:I. Horev, B. Nadler, E. Arias-Castro, M. Galun, R.Basri
在计算预算上检测长边:sub-linear 方法
(暹罗 2015)。该方法旨在在嘈杂的强度图像中找到这些难以捉摸的边缘和脊。
在附图中有周期性的垂直条纹,它们沿 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);
这导致图像的以下一维信号。
然后您可以在此信号上找到适合您的阈值,并使用索引作为线位置。
但是,如果您有兴趣定位条纹本身而不是它们的边缘,您可能会考虑一种稍微不同的方法:
我建议首先去掉"DC"成分,这样条纹会"pop 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);
这是结果(您可能想更改阈值并查看它如何影响结果):
估计"DC"、dc_est
长得像:
如果您想要进行更精细的冒险,我建议您探索这部作品:I. Horev, B. Nadler, E. Arias-Castro, M. Galun, R.Basri 在计算预算上检测长边:sub-linear 方法 (暹罗 2015)。该方法旨在在嘈杂的强度图像中找到这些难以捉摸的边缘和脊。