Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB:灰度图像中非连续垂直条纹的检测_Matlab_Image Processing_Computer Vision_Image Segmentation_Edge Detection - Fatal编程技术网

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

MATLAB:灰度图像中非连续垂直条纹的检测,matlab,image-processing,computer-vision,image-segmentation,edge-detection,Matlab,Image Processing,Computer Vision,Image Segmentation,Edge Detection,在所附图像中,存在沿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信号 然后,您可以在此信号上找到合适

在所附图像中,存在沿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信号

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

的答案非常好:他建议使用一个垂直边缘过滤器来捕获条纹的垂直边缘。
然而,如果你有兴趣定位条纹本身而不是它们的边缘,你可以考虑稍微不同的方法:

我建议,首先,消除“DC”成分,这样条纹将从大致恒定的背景中“弹出”,然后使用垂直
来定位它们并生成遮罩

下面是代码的草图:

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
如下所示:


如果您正在经历一次更为复杂的冒险,我建议您探索这项工作:。该方法的目的是在有噪声的强度图像中寻找这些难以捉摸的边缘和脊线