Matlab 如何重写默认行检测过滤器,使其适用于任何像素宽度而不是一个像素宽度的对象
我正在尝试使用内置的Matlab函数检测水平线。我读到过滤器:Matlab 如何重写默认行检测过滤器,使其适用于任何像素宽度而不是一个像素宽度的对象,matlab,image-processing,edge-detection,Matlab,Image Processing,Edge Detection,我正在尝试使用内置的Matlab函数检测水平线。我读到过滤器:w=[-1-1-1;22;-1-1-1]应用于图像时将检测到1像素宽的水平线。由于其在水平方向上的响应较高,在其他情况下,其响应为零 我的问题是,我想检测的线超过1像素宽。例如,我想检测此图像中的白线: 现在,如果我使用以下方法对该图像应用上述过滤器: lines = imfilter(img, w); imshow(lines) 它产生以下结果: 它已经按预期工作,即它检测到了1像素厚的水平线,我想这就是为什么它只检测到线的边
w=[-1-1-1;22;-1-1-1]
应用于图像时将检测到1像素宽的水平线。由于其在水平方向上的响应较高,在其他情况下,其响应为零
我的问题是,我想检测的线超过1像素宽。例如,我想检测此图像中的白线:
现在,如果我使用以下方法对该图像应用上述过滤器:
lines = imfilter(img, w);
imshow(lines)
它产生以下结果:
它已经按预期工作,即它检测到了1像素厚的水平线,我想这就是为什么它只检测到线的边缘或边界。我想让它检测到完整的白线
那么我该如何做到这一点呢?我如何仅将线路设置为我感兴趣的区域,然后单独处理它们
我认为实现这一点的一种方法是,我以某种方式找出白线的像素宽度,然后制作一个新内核来处理这些维度,但是我如何找到像素宽度呢?如何为所述宽度制作新内核
还是我完全走错了路 您可以尝试使用
bwmorph
功能
例如:
skel=bwmorph(bwmorph(YourImage,'erode', 6),'skel', Inf);
imshow(skel)
结果:
编辑如果要查找行的位置和长度,可以使用regionprops
,如下所示:
Framed = padarray(YourImage,[3 3],0,'both');
imshow(Framed)
hold on;
for k=1:length(centroids)
line([1 BBoxes{k}(3)],[centroids{k}(2) centroids{k}(2)])
end
hold off;
(这会在图像周围添加一个黑色边框,以隔离单独的线)
线的位置位于质心
中每个向量的第二个元素中,线的长度可以从b框
中的边界框中推断出来
您可以这样绘制结果:
Framed = padarray(YourImage,[3 3],0,'both');
imshow(Framed)
hold on;
for k=1:length(centroids)
line([1 BBoxes{k}(3)],[centroids{k}(2) centroids{k}(2)])
end
hold off;
结果:
我看到你没有接受我的回答,你遇到问题了吗?请看我的编辑,我在图像周围添加了一个黑色边框以隔离线条。嗨,Jigg,是的,对此很抱歉。编辑后我接受了你的答案。谢谢你的帮助没问题,很高兴能帮上忙。