使用Hough变换找到形成线的点

时间:2014-10-22 21:27:04

标签: matlab hough-transform

我有一个数据集,我想将这些点分组,形成与Y轴平行的线(见图)。我想这样做的方法是使用霍夫变换;你有什么建议在Matlab中怎么做吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

嗯,通过限制,仅检测平行于y轴的线,不需要完整的霍夫变换。只需投影x轴上的所有点,就可以累积它们并找到峰值。

%assuming you want a resolution of 0.01 covering x space from 0 to 1
points = rand(1000,2);
figure(1);
plot(points(:,1),points(:,2),'b.');
minX = 0;
maxX = 1;
resolution = 0.01;
xValues = minX:resolution:maxX;
accu = zeros(1,length(xValues));
for i = 1:length(points)
    xVal = points(i,1); % access x value of point;
    idx = round(((xVal-minX)/resolution))+1;
    accu(idx) = accu(idx) +1;
end

现在你有一个累加器,你可以搜索最大值。

[pks,idx] = findpeaks(accu);

您可能只想考虑至少minPoints点的峰值:

minPoints = 10;
idx = idx(pks>minPoints);

然后你可以进一步处理这一行:

for i = 1:length(idx)
    % select all points corresponding to line:
    idc = abs(points(:,1)-xValues(idx(i))) < resolution/2;
    pointsOnLine = points(idc,:);
    figure(1);
    hold on;
    plot(pointsOnLine(:,1),pointsOnLine(:,2),'ro');
    minY = min(pointsOnLine(:,2));
    maxY = max(pointsOnLine(:,2));
    plot([xValues(idx(i)),xValues(idx(i))],[minY,maxY],'r-');
end

要删除间隙较大的行,您可以使用sort()根据y值对点进行排序,然后使用diff查找大跳跃。