我正在寻找一种算法,以便将任意矩形最佳拟合到无序点集。具体来说,我正在寻找一个矩形,其中点与任何一个矩形边缘的距离之和最小。我找到了很多最合适的直线,圆和椭圆算法,但没有找到矩形。理想情况下,我喜欢C,C ++或Java中的某些东西,但对语言并不那么挑剔。
输入数据通常由位于矩形上或靠近矩形的大多数点组成,并带有一些异常值。数据分布不均匀,不太可能包括所有四个角落。
答案 0 :(得分:3)
以下是一些可能对您有所帮助的想法。
我们可以估算一个点是在边缘还是在拐角处,如下所示:
Covariance = ((0, 0), (0, 0))
d = point - centroid
Covariance += outer_product(d, d)
提取所有角点并进行分段。选择包含大多数条目的四个细分。这些段的质心是矩形角的候选者。
计算两个相对边的归一化方向向量并计算它们的平均值。计算另外两个相反方的平均值。这些是平行四边形的方向向量。如果需要矩形,请计算其中一个方向的垂直向量,并使用另一个方向向量计算平均值。然后矩形的方向是平均向量和垂直向量。
为了计算角点,你可以在它们的方向上投射候选者并移动它们,使它们形成矩形的角落。
答案 1 :(得分:1)
这是一个大致的想法。用小细胞制作网格;计算每个不太空的单元格的最佳拟合线(计算是立即 1 ,不涉及搜索)。加入相邻的细胞,同时确保标准偏差正在改善/不会恶化。因此,我们检测四个边和四个角,并将我们的点分成四组,每组属于四个边中的一个。
接下来,我们扔掉角落细胞,将真正的矩形放在四个近似的位置
线和做一点爬山(或其他)。对于这种情况,可以增加最佳拟合线的计算,因为两条线是平行的,并且我们已经将我们的点分成四组(对于给定的矩形,我们知道两个相对边之间的delta-y(暂时取水平方面,所以我们只需将此delta-y添加到较低点组的y
s并进行计算。
初始矩形网格可以用条纹(例如,垂直)替换。然后,至少一半的条纹将具有两个明显的点分组(通过将每个条纹除以水平分割线到细胞中来找到它们)。
1 对于一条线Y = a*X+b
,最小化数据点垂直距离的平方和{x i ,y i }到那一行。这可以直接针对a
和b
进行解决。对于更多垂直线,请翻转X和Y.
P.S。我将这个问题解释为最小化每个点到矩形的最近边的垂直距离的平方和,而不是矩形的所有边。
答案 2 :(得分:1)
最佳拟合线的想法是计算点与线y = ax + b之间的垂直距离。然后,您可以使用微积分来查找a和b的值,以最小化距离的平方和。选择平方的原因是绝对值是因为前者在0时是可微分的。
如果你用矩形尝试相同的方法,你会遇到这样的问题:到矩形边的距离的平方是一个分段定义的函数,有8个不同的部分,当部分相遇时不可区分在矩形内部。
为了继续,你需要决定一个函数来衡量一个点距离一个可区分的矩形的距离。
答案 3 :(得分:0)
我不完全确定,但你可能会从你的观点到PCA的前2(3?)维度。对于大多数情况,它会合理地运行。