繁体   English   中英

最佳拟合矩形的算法

[英]Algorithm for best fit rectangle

我正在寻找一种算法,以使任意矩形最适合无序点集。 具体来说,我正在寻找一个矩形,该矩形的点到任一矩形边缘的距离之和最小。 我发现很多最佳拟合线,圆和椭圆算法,但没有一个适合矩形。 理想情况下,我想要用C,C ++或Java编写的东西,但对语言的要求并不高。

输入数据通常将由位于矩形上或矩形附近的大多数点组成,并且具有一些异常值。 数据的分布将是不均匀的,不可能包含所有四个角。

以下是一些可能对您有所帮助的想法。

我们可以估计一个点是在边上还是在拐角上,如下所示:

  1. 收集点的n个近邻
  2. 计算点的质心
  3. 计算点的协方差矩阵,如下所示:
    1. Covariance = ((0, 0), (0, 0))开头
    2. 对于每个点,计算d = point - centroid
    3. Covariance += outer_product(d, d)
  4. 计算协方差的特征值。 (例如,使用SVD)
  5. 分类点:
    • 如果一个特征值很大而另一个特征值很小,那么我们可能处于边缘
    • 否则我们应该在一个角落

提取所有角点并进行分割。 选择条目最多的四个细分。 这些线段的质心是矩形角的候选对象。

计算两个相对侧的归一化方向向量,并计算其平均值。 计算另外两个相对边的平均值。 这些是平行四边形的方向向量。 如果需要矩形,请计算与这些方向之一垂直的向量,并与另一个方向向量计算平均值。 那么矩形的方向是均值向量和垂直向量。

为了计算拐角,可以将候选对象投影到其方向上并移动它们,以使它们形成矩形的拐角。

这是一个总体思路。 用小格做成网格; 计算每个非太空单元格的最佳拟合线(计算为立即数1 ,不涉及搜索)。 加入相邻的单元格,同时确保标准偏差正在改善/不会明显恶化。 因此,我们检测到四个边和四个角,并将我们的点划分为四个组,每个组属于四个边之一。

接下来,我们丢弃角单元,将真实的矩形替换为四个近似线,然后进行一些爬坡(或其他操作)。 在这种情况下,可能会增加最佳拟合线的计算,因为这两条线是平行的,并且我们已经将点分为四个组(对于给定的矩形,我们知道两个相对侧之间的增量y(因此,我们只需将此增量-y与较低的一组点的y相加即可进行计算)。

最初的矩形网格可以用条纹(例如,垂直)加工代替。 然后,至少一半的条纹将具有两个明显的点分组(通过将每个条纹按水平分割线划分为像元来查找它们)。


1对于线Y = a*X+b ,最小化数据点{x i ,y i }到该线的垂直距离的平方和。 对于ab可直接解决。 要获得更多垂直线,请翻转Xs和Ys。

PS I将问题解释为最大程度地减少了每个点矩形最近侧 (而不是矩形所有侧)的垂直距离的平方和。

最佳拟合线的想法是计算点与线y = ax + b之间的垂直距离。 然后,您可以使用微积分找到a和b的值,以最小化距离平方和。 之所以选择平方而不是绝对值,是因为前者在0时可微。

如果要对矩形尝试相同的方法,则会遇到一个问题,即到矩形边的距离的平方是由8个不同块组成的分段定义函数,当这些块在内部相交时是不可微的长方形。
到矩形的距离不同的8个区域
为了继续进行下去,您需要确定一个函数,该函数测量点与到处都是可微分的矩形的距离。

我不确定,但是从您的角度来看,您可能会在PCA的前2(3?)个维度上玩游戏。 在大多数情况下,它将运行得相当快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM