0

我想在我的二进制图像中获得轮廓直线度的度量(相对更快)。图像如下所示:

轮廓

现在,红色框中的轮廓是我希望最好删除的轮廓。因为他们不是直的。这些是我尝试过的事情。我现在在 MATLAB 中实现。

1.收集每个轮廓的行列坐标,然后求导。对于直线对象(例如矩形),导数大多较低,带有一些尖峰(沿着矩形的角)。

问题:收集的坐标不是按顺序排列的,即如果我们将轮廓成像为路径,将按照该顺序遍历轮廓。因此,导数有时会给出高得离谱的值。另外,轮廓不是绝对笔直的,它是边缘检测算法的输出,所以你可以想象可能会有一些不连续(见底部的矩形,人眼可以理解它是一个矩形,虽然它不是绝对笔直的)。

2.试图考虑polyfit,但又出现了这个轮廓问题。由于它是一个矩形,我不知道如何将 polyfit 应用于该点集。

另外,我想删除垂直/水平分布的轮廓。基本上这是一种车道检测算法。所以车道不能绝对垂直/水平。

有任何想法吗?

4

2 回答 2

2

您应该研究regionprops更多的功能。公平地说,我从这个答案中偷了脚本,但它是:

BW = imread('lanes.png');
BW  = im2bw(BW);
figure(1),
subplot(1,2,1);
imshow(BW);

cc = bwconncomp(BW);
l = labelmatrix(cc);

a_rp = regionprops(CC,'Area','MajorAxisLength','MinorAxislength','Orientation','PixelList','Eccentricity');
idx = ([a_rp.Eccentricity] > 0.99 & [a_rp.Area] > 100 & [a_rp.Orientation] < 70 & [a_rp.Orientation] > -90);

BW2 = ismember(l,find(idx));

subplot(1,2,2);
imshow(BW2);

你可以弄乱属性。'Orientation', 'Eccentricity', 并且'Area'可能是您想要处理的参数。我还弄乱了长轴/短轴长度的比率,但偏心率基本上是这样做的(偏心率是衡量椭圆“圆形”程度的指标)。这是输出:

在此处输入图像描述

我实际上看到了一个很好的视频,专门来自 matlab 用于使用regionprops. 我会尝试看看我是否可以找到它并链接它。

于 2013-03-23T03:57:50.793 回答
1

您可以使用 分割图像bwlabel,然后使用 分别处理每个bwlabel连接的对象find。这应该有助于解决您的订单问题。

关于度量,目前唯一想到的就是拟合椭圆,并将a/b(长轴/短轴)比率(基本上是偏心率)设置为参数。例如,一条直线(即使不是完美的)将被拟合到一个长轴非常大而短轴非常小的椭圆。因此,假设您将比率阈值设置为 >10 等...例如,可以使用此FEX 提交来拟合椭圆。

于 2013-03-23T03:58:06.953 回答