【问题标题】:Find points forming lines using Hough transform使用霍夫变换查找形成线的点
【发布时间】:2018-08-26 23:49:25
【问题描述】:

我有一个数据集,我想将点分组形成平行于 Y 轴的线(见图)。我想这样做的方法是使用霍夫变换;您对如何在 Matlab 中执行此操作有任何建议吗?

【问题讨论】:

  • 在您看来,线条在哪里?如果你让我画出基本事实,我会很尴尬。
  • 线条应平行于 Y 轴。我更新了问题。
  • 您的选择看起来相当随意,仅显示两个案例是不够的。你能显示所有的线条吗? [我敢打赌,你不能以可重现的方式。]如果它们完全垂直,首先要做的是将所有点投影到水平尺寸上并观察局部点密度。您可以使用 Parzen 窗口估计分布的模式。 (其实这是霍夫变换的定角版本。)
  • 这些中心对齐是否有合理的原因?为什么点云这么乱?

标签: matlab hough-transform


【解决方案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找到大的跳跃。

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2019-09-16
    • 2013-03-09
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多