我正在尝试使用内置的Matlab函数检测水平线。我已经读过滤镜:w = [-1 -1 -1;2 2 2;-1 -1 -1]
当应用于图像时会检测到1像素宽的水平线。由于其响应在水平方向上会更高,而在其他情况下,其响应将为零。
我的问题是我要检测的线宽超过1像素。例如,我想检测此图像中的白线:
现在,如果我使用以下方法在此图像上应用上述过滤器:
lines = imfilter(img, w);
imshow(lines)
它产生以下结果:
它按预期工作,即检测到1像素厚的水平线,我猜这就是为什么它只检测到线的边缘或边界。我希望它能检测出完整的白线。
那么我该如何做到这一点?我如何只将线条作为我感兴趣的区域,然后单独处理它们?
我认为这样做的一种方法是,我以某种方式找出白线的像素宽度,然后制作一个新的内核来处理这些尺寸,但我如何找到像素宽度?如何为所述宽度制作新内核?
还是我走错了路?
答案 0 :(得分:2)
您可以尝试使用bwmorph
功能。
示例:
skel=bwmorph(bwmorph(YourImage,'erode', 6),'skel', Inf);
imshow(skel)
结果:
修改如果您在行的位置和长度之后,可以使用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;
结果: