Python 简化坐标表

Python 简化坐标表,python,numpy,opencv,Python,Numpy,Opencv,我为函数cv.matchTemplate提供了一个模板图像和一个测试图像 返回后,我过滤掉95%匹配率下的任何内容。结果很好,我正在产生预期的结果。结果是一个元组列表,每个元组由(x,y)表示。问题是在筛选后,我有太多的结果。似乎每个潜在匹配都会产生不止一个点: (150, 143) (151, 143) (152, 143) (153, 143) (154, 143) (155, 143) (149, 144) (150, 144) (151, 144) (152, 144) (153, 14

我为函数
cv.matchTemplate
提供了一个模板图像和一个测试图像

返回后,我过滤掉95%匹配率下的任何内容。结果很好,我正在产生预期的结果。结果是一个元组列表,每个元组由
(x,y)
表示。问题是在筛选后,我有太多的结果。似乎每个潜在匹配都会产生不止一个点:

(150, 143)
(151, 143)
(152, 143)
(153, 143)
(154, 143)
(155, 143)
(149, 144)
(150, 144)
(151, 144)
(152, 144)
(153, 144)
(154, 144)
(155, 144)
(156, 144)

(694, 144)
(695, 144)
(696, 144)
(697, 144)
(698, 144)

(148, 145)
(149, 145)
(150, 145)
(151, 145)
(152, 145)
(153, 145)
(154, 145)
(155, 145)
(156, 145)
(157, 145)

(692, 145)
(693, 145)
(694, 145)
(695, 145)
(696, 145)
(697, 145)
(698, 145)
(699, 145)

(147, 146)
(148, 146)
(149, 146)
(150, 146)
(151, 146)
(152, 146)
(153, 146)
(154, 146)
(155, 146)
(156, 146)
(157, 146)
所有这些点都是
元组
,它们位于单个排序的
列表中
您可以看到,这些点可以“逻辑地”组合在一组,在坐标上没有太大差异。在上述示例输出中,有5个可区分的“组”。这里的想法是将每个减少为一个点

从上面开始,这将浓缩到以下列表:

(151,143)
(694, 144)
(148, 145)
(692, 145)
(147, 146)

有什么方法可以做到这一点吗?

修复了这个问题,因为OP注释了列表中的所有元组。
第一个if条件是,如果您发现您希望对点之间的差异更严格/更不严格(例如,如果您希望它在5像素以内,您可以执行“所有这些点元组都在一个排序列表中”,则可以更改某些内容。只有一个元组列表,因此您的示例将生成一个x和一个y。使用平均值是可以的,但如何在计算平均值之前将这些点划分为多个存储桶?。对此进行了编辑。根据需要更改if条件,以区分两组不同的点。如果您要求使用某些函数除了看坐标之外,如果两个点在同一组中,那是我无法理解的。因为我做了很好的尝试,所以我对此进行了改进,并使用了一些条件来解决问题。我发现了一种称为K意味着聚类的方法。我想我会尝试这种算法,因为它更为简单。实际上,K意味着没有任何条件的聚类指定K的代价要大得多。啊,好吧。我对这个问题有点误解。祝你好运-如果你不介意在完成后发布你的实现,这将是一个整洁的过程,对未来的其他人会很有帮助。你能解释一下你是如何将分组元组简化成每个点的吗?如果你想象一个图上的点,你会I’我会注意到有些分组非常接近。我基本上想将这些点简化为一个点。目前我没有这样做的方法,我只是解释我想要的结果。对于每个分组的元组,你可以平均这些点以获得一个结果点。在你的输出元组列表中,我不确定为什么有两个
(148145)
pointssorry我删除了这一点,这是一个输入错误。至于你的建议,元组没有分组,因此答案需要一种将它们分组的方法。我尝试了绘图,并确定分组是非常主观的……如果你想要一个严密的解决方案,你需要编纂规则。
masterTest = [(1, 2), (1, 3), (2, 3), (4, 6), (4, 7), (4, 8)] #test array
arrayHolder = [] #buffer that holds the first mini list
compositeArray = [] #master list which holds a list of the tuples, grouped
lastTuple = masterTest[0] #dummy variable
arrayHolder.append(masterTest[0]) # add the first one so we have something to compare to
masterTest.pop(0) # it's already in our data, don't want a dup
for tuples in masterTest:
    if (((abs(tuples[0] - lastTuple[0]) == 1 and abs(tuples[1] - lastTuple[1]) == 0)) or
         (abs(tuples[1] - lastTuple[1]) == 1 and abs(tuples[0] - lastTuple[0]) == 0)):
        arrayHolder.append(tuples)
    else:
        compositeArray.append(arrayHolder.copy()) #add buffer to master list 
        arrayHolder = [] #clear out the buffer
        arrayHolder.append(tuples) #restart a new buffer
    lastTuple = tuples # update last coordinate checked


compositeArray.append(arrayHolder) #clears the buffer one last time

pointArray = []
for lists in compositeArray:
    count = 0
    xavg = sum([x[0] for x in lists])/len(lists)
    yavg = sum([x[1] for x in lists])/len(lists)
    pointArray.append(tuple((xavg, yavg)))

print (pointArray)