【问题标题】:Fast way to thin 2D point data精简二维点数据的快速方法
【发布时间】:2015-11-14 06:33:09
【问题描述】:

我有一组 [X Y] 格式的 2D 数据,我将根据某个距离阈值对它们进行细化,即如果点非常接近小于阈值,则会消除一个。这个过程一直持续到任意两点之间的距离大于阈值。我开发了一个代码来做到这一点,但它非常耗时。我想知道在 Matlab 中是否有更好的方法。

【问题讨论】:

  • 请发布您的代码。我们最终可以找到瓶颈并提出改进建议。另外,必须尝试您的配置文件吗?
  • 这是一种方法。 1. 找点(你已经有了)。 2. 使用imresize 调整由这些二维数据点创建的“矩阵”的大小。 3. 重新找到调整位置的点。如果只有一个点而不是两个点,则超过了阈值。 imresize 函数句柄在某种意义上充当了阈值。
  • @bla,有趣的想法,但这不仅会减少数据,还会强制它们进入网格。
  • 在我看来,定义阈值就是定义某种大小的网格。
  • 当两点要靠近时,有什么具体的规则要去掉吗?

标签: matlab 2d


【解决方案1】:

只是为了给出一个比成对比较更好的简单想法。

令 d 为您想要达到的最小距离。创建一个边长为sqrt(d)的正方形网格。

  1. 将每个点放入它的正方形中。每个方格只保留一个点。如果一个正方形中有两个点,它们的距离小于d
  2. 您还有一些距离小于 d 的剩余点,但对于每个点,您只需检查周围正方形的 8 邻域。

【讨论】:

  • Daniel,听起来不错,但我不知道如何实现它。你有任何类似的代码可供我测试并与我的比较吗?
【解决方案2】:

您可以按照此处所述计算距离

Calculating distance of all the points in a region with each other

所以只需复制粘贴他的答案:

 X are your points with coordinates x = X(:,1), y = X(:,2)

dist = sqrt(bsxfun(@minus,X(:,1),X(:,1)').^2 + bsxfun(@minus,X(:,2),X(:,2)' ).^2)

这为您提供了一个矩阵,其中包含每个点之间的所有距离。使用find(dist<thres),您可以获得低于您阈值的距离位置。然后使用ind2sub 确定要删除的数据的位置

【讨论】:

  • 嗨,马蹄铁,我试图测试你的方法,但卡在 ind2sub 上。如何使用 ind2sub 获取要删除的点的位置?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2020-07-24
相关资源
最近更新 更多