【发布时间】:2012-07-10 05:56:54
【问题描述】:
编辑:更改了标题。我对这两个段是否相同不太感兴趣,而是如果它们彼此共线,则在一定的公差范围内。如果是这样,那么这些线应该聚集在一起作为一个单独的段。
编辑:我想一个简短的说法:我正在尝试以一种有效的方式将相似的线段聚集在一起。
假设我有线段 f (fx0, fy0) 和 (fx1, fy1) 和 g (gx0, gy0) 和 (gx1, gy1)
这些来自诸如计算机视觉算法边缘检测器之类的东西,在某些情况下,两条线基本相同,但由于像素公差而被视为两条不同的线。
有几种情况
-
f和g共享完全相同的端点,例如:f = (0,0), (10,10) g = (0,0), (10,10) -
f和g共享大致相同的端点,并且长度大致相同,例如:f = (0,0.01), (9.95,10) g = (0,0), (10,10) -
f是g的子集,这意味着它的端点落在g段内,并与g段共享相同的斜率。想象一条粗略的线,笔在其中来回移动以使其变粗。例如:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)
以下内容将不视为相同:
-
f和g在一定的tolerance以上有斜率差 -
f和g可能具有相同的斜率,但相隔超过tolerance的距离,即平行线 -
f和g在同一平面和同一坡度上,但根本不重叠...即虚线内的一组线段。
判断它们是否相同的最简单方法是gx1 - fx1 <= tolerance(对其他三个点重复),但在某些情况下,f 行可能比g 行短(同样,因为像素差异和/或照片扫描不佳)。
那么将两个线段转换成极坐标并比较角度会更好吗?在这种情况下,两个 rho 将在容差范围内。但是你必须确保两条线段具有相同的“方向”,这在笛卡尔坐标或极坐标中计算是微不足道的。
所以这很容易找到一种方法,但我只是想知道是否有一种更清洁的方法,基于我早已忘记的线性代数?
【问题讨论】:
-
我认为你需要更清楚。指定线段需要四个数字,用于线的开始和结束的坐标,而您似乎为每条线指定了两个。另外,您是否认为从 (0,0) 到 (1,1) 的线与从 (0,0) 到 (10,10) 的线“相同”?显然它们都在同一个方向,但一个比另一个长得多。
-
哎呀,好电话。我添加了一些明确的术语和通过/失败的情况。谢谢。是的,我会认为 (0,0) 到 (1,1) (或轻微的变化,例如 [0, 0] 到 [1, 1.02])与 (0,0) 到 (10,10) 相同),出于本练习的目的。
标签: ruby math opencv computer-vision cluster-analysis