如何重写默认线检测滤镜以处理任何像素宽度而不是一个像素宽的对象

时间:2014-01-07 15:49:29

标签: matlab image-processing edge-detection

我正在尝试使用内置的Matlab函数检测水平线。我已经读过滤镜:w = [-1 -1 -1;2 2 2;-1 -1 -1]当应用于图像时会检测到1像素宽的水平线。由于其响应在水平方向上会更高,而在其他情况下,其响应将为零。

我的问题是我要检测的线宽超过1像素。例如,我想检测此图像中的白线:

enter image description here

现在,如果我使用以下方法在此图像上应用上述过滤器:

lines = imfilter(img, w);
imshow(lines)

它产生以下结果:

enter image description here

它按预期工作,即检测到1像素厚的水平线,我猜这就是为什么它只检测到线的边缘或边界。我希望它能检测出完整的白线。

那么我该如何做到这一点?我如何只将线条作为我感兴趣的区域,然后单独处理它们?

我认为这样做的一种方法是,我以某种方式找出白线的像素宽度,然后制作一个新的内核来处理这些尺寸,但我如何找到像素宽度?如何为所述宽度制作新内核?

还是我走错了路?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用bwmorph功能。

示例:

skel=bwmorph(bwmorph(YourImage,'erode', 6),'skel', Inf);
imshow(skel)

结果:

skeleton of lines

修改如果您在行的位置和长度之后,可以使用regionprops,如下所示:

Framed = padarray(YourImage,[3 3],0,'both'); 

(这会在图像周围添加黑框以隔离各行)。

props=regionprops(Framed, 'Centroid', 'BoundingBox');
centroids={props.Centroid};
BBoxes={props.BoundingBox};

行的位置位于centroids中每个向量的第二个元素中,行的长度可以从BBoxes中的边界框推导出来。

你可以像这样绘制结果:

imshow(Framed)
hold on;
for k=1:length(centroids)
    line([1 BBoxes{k}(3)],[centroids{k}(2) centroids{k}(2)])
end
hold off;

结果:

Lines drawn on top of image