我正在处理一个应用程序,我有一组轮廓(每个轮廓代表一个潜在的线),我想检查"多么直接"是轮廓/形状。 我作为参考文章使用的文章使用以下技术:
匹配"分段"穿过这样的形状的线 -
然后评分"直接"是这条线。
以下是我正在研究的轮廓的一个例子:
你将如何实施这项技术? 有没有其他检查方法" How Straight"是一个轮廓\形状?
问候!
答案 0 :(得分:2)
我的第一个猜测是使用coefficient of determination。那就是,假设一些合理的起源,你不会得到舍入误差并计算R ^ 2,那么你的所有点都应该是一条直线。
如果所有轮廓都是断开连接的组件,更高级的方法是计算structure model index(链接用于骨骼形态测量,但他们解释了这个概念并引用了原始纸张。)这给你一个数字它会告诉你你的细分市场是多少"就像一根杆子#34;不过,这只是一个想法。任何形成曲线或有分支的东西都会越来越像棒。
我想说这也取决于你使用的指标是什么,如果你的轮廓总是从左到右。
另一种方法是创建点的covariance matrix,计算该矩阵的特征值,并取其比率(比率大于或等于1;否则,反转比率。)除了最终比率之外,这是PCA背后的基本原则。如果您有一个相当线性的数据集(数据集仅在一个方向上变化),那么您将具有非常大的比率。随着数据集变得越来越不线性(或更不相关),您会看到比率接近1。一个完美的线性数据集将是无限的并且是一个完美的圆形数据集(我相信,但如果有人可以为我验证这一点,我将不胜感激。)此外,在二维工作意味着计算将是计算上便宜且直接的。
这将非常好地处理异常值,并且对于轮廓的旋转和形状将是不变的。你也有一个总是积极的数字。唯一的问题是在划分两个特征值时防止溢出。然后,您可以始终将较小的特征值除以较大的值,并且您的度量将在0和1之间进行约束,一个是圆,零是直线。
无论哪种方式,您都需要测试此参数是否对您的应用程序足够敏感。
答案 1 :(得分:0)
简单算法的一个示例是使用两个段之间的点积来确定它们之间的角度。点积的公式为:
A * B = ||A|| ||B|| cos(theta)
求解cos(theta)的等式得出
cos(theta) = (A * B / (||A|| ||B||))
由于cos(0) = 1, cos(pi) = -1.0
并且您正在检查线条的“直线度”,因此cos(theta)
角度的归一化最接近-1.0的线是最直的。
straightness = SUM(cos(theta))/(number of line segments)
其中直线接近-1.0,非直线接近1.0。请记住,这是对该算法的粗略评估,它显然具有需要在实现中解决的边缘情况和警告。
答案 2 :(得分:0)
诀窍是使用image moments。简而言之,您计算轴周围的最小惯量,围绕垂直轴的惯性,以及它们之间的比率(总是在0和1之间;因为惯性是非负的)
对于直线,沿线的惯性为零,因此比率也为零。对于圆,惯性沿所有轴是相同的,因此比率为1。你的分段线将是0.01左右,因为它是一个相当不错的匹配。
更简单的方法是将包含形状的凸多边形的周长与形状本身的周长进行比较。对于一条线,它们平凡地相等,并且对于一个不太弯曲的形状,它仍然具有可比性。