评估任意轮廓的直线度

时间:2013-03-22 23:02:55

标签: matlab image-processing computer-vision line contour

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

Contours

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

1.收集每个轮廓的行和列坐标,然后取导数。对于直线对象(例如矩形),导数将大部分为低,并且有一些尖峰(沿着矩形的角)。

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您应该更多地研究regionprops的功能。为了公平起见,我从this answer偷走了剧本,但这里是:

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'可能是您想要搞砸的参数。我也讨论了长轴/短轴长度的比例,但偏心率基本上是这样的(偏心率是椭圆“圆形”的度量)。这是输出:

enter image description here

我实际上从matlab看到了一个很好的视频,用于使用regionprops进行车道检测。我会试着看看是否可以找到并链接它。

答案 1 :(得分:1)

您可以使用bwlabel对图片进行细分,然后使用bwlabel在每个find连接的对象上单独处理。这应该有助于解决您的订单问题。

关于指标,目前唯一想到的是适合椭圆,并将a/b(长轴/短轴)比(基本上是偏心)设置为参数。例如,直线(即使不完美)将适合具有非常大的主轴和非常小的短轴的椭圆。所以说你设置一个比率阈值> 10等...例如,可以使用这个FEX submission来拟合椭圆。