我有一组函数可以生成一个配对点列表,如下所示:
my_list=[((57.5, 3048.0), (62.0, 3050.0)), ((82.0, 1006.0), (93.0, 1021.5)), ((95.0, 1354.0), (86.0, 1336.0)), ((95.0, 1354.0), (89.0, 1327.0))...]
这样每对都是:
((57.5, 3048.0), (62.0, 3050.0)) Pair 0
((82.0, 1006.0), (93.0, 1021.5)) Pair 1
((95.0, 1354.0), (86.0, 1336.0)) Pair 2
((95.0, 1354.0), (89.0, 1327.0)) Pair 3
((104.0, 2366.0), (109.0, 2350.0)) Pair 4
((104.0, 2370.0), (109.0, 2350.0)) Pair 5
((122.5, 2375.0), (109.0, 2350.0)) Pair 6
等
这是从分析图像生成的X,Y
坐标的长列表。我需要找到一种拒绝大多数观点的方法。
任何少于3分不落在类似线上的东西(不确切,需要一些摆动空间)都需要被拒绝。
大多数点是不在一条线上的簇,或者只是一条线上的两个点。有没有办法运行这个列表,只在大致相同的行上保存3个或更多点的集合?
这是一张展示我所追求的图片。图像显示了由功能发现的微弱的移动小行星以及所有发现的噪声。您可以看到小行星大致在同一条线上有3 +点,而噪音相当随机。我试图丢弃同一条线上只有两点的点。
要问很多,但必不可少!
实施答案1后
答案 0 :(得分:2)
您可以找到一个点与两个其他点之间的线距离的等式。 (https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line)。
def distance(point, segment):
"""Distance from a point to a line formed by a segment"""
...
然后遍历所有段并计算每个点的距离。您需要一个“足够接近”的阈值。然后,您可以列出靠近一条线的所有点。这样的事情。
ON_LINE_THRESHOLD = 1.5
for segment in my_list:
close_points = []
for point1, point2 in my_list:
if distance(point1, segment) < ON_LINE_THRESHOLD:
close_points.append(point1)
if distance(point2, segment) < ON_LINE_THRESHOLD:
close_points.append(point2)
if len(close_points) >=3:
# Close points will always be at least two as it includes the end points.
do something!
您对一行中的点列表所做的事情取决于您。