将地面真实颜色列表与另一种颜色列表进行比较

时间:2019-06-23 00:20:49

标签: python numpy opencv scipy

我有2种颜色的阵列/列表。一种表示图像中的 actual 主色,另一种表示算法认为是图像中的主色的列表色。

我想比较这两个列表,以了解算法与 actual 底色真值列表的接近程度。 *如果两种颜色之间的欧式距离小于等于25,则认为它们接近(相同)。

问题在于2个列表的长度不一定相同。并且每个列表中的颜色不会有任何顺序。颜色将始终位于颜色空间CieLABcv2.COLOR_BGR2LAB)中。

2个列表的示例,我需要比较相似性。请注意,它们的顺序不同,列表长度也不同。但是,这两种颜色被认为是相同的,因为它发现了地面真实情况中的所有颜色(加上一些额外的颜色),并且所有这些颜色相距<= 25。

  

ground_truth = [[76,177,34],[36,28,237],[204,72,63],[0,242,255]]
  结果= [[35,29,234],[200,72,63],[70,177,34],[0,242,250],[45,29,67],[3,90,52] ]

我在下面建立了一个验证器,但是我不确定它是否正确?对如何实现上述目标有何建议?

def validator(algoTuner, result, ground_truth):
    # Score = How close the colours in result are to the colours in ground_truth

    # p = pairwise distance between result and ground_truth
    # hits = get all distances from p that are <= max_dist
    # score = float(len(hits)) / len(ground_truth)
    dists = cdist(result, ground_truth, 'euclidean')
    score = float(len(dists[ dists < 25 ])) / len(ground_truth)
    return score

在@Nakor回答后,

编辑,这会更正确吗?请记住,该算法可以找到比真实情况更多的颜色。重要的是算法会根据地面真实情况找到所有正确的颜色,任何其他颜色都不会影响得分。

def validator(algoTuner, result, ground_truth, debug=False):
    dists = cdist(result, ground_truth, 'euclidean')
    correct_guesses = np.sum(dists<25, axis=1)
    correct_guesses = correct_guesses[ correct_guesses > 0 ]
    # score = correct_guesses.mean()
    score = float(correct_guesses.size) / len(ground_truth)

    if debug:
        print(len(correct_guesses))
        print(correct_guesses)
        print(score)
    return score

1 个答案:

答案 0 :(得分:0)

我认为您计算分数的部分不正确。您正在计算全球范围内低于25个的元素数。但是,如果我理解正确,那么您正在寻找的是,ground_truth中的每种颜色是否至少有一种颜色在result中小于25点。

如果是这种情况,那么我将使用以下方法修改您的验证器:

def validator(algoTuner, result, ground_truth):
    # Score = How close the colours in result are to the colours in ground_truth

    # p = pairwise distance between result and ground_truth
    # hits = get all distances from p that are <= max_dist
    # score = float(len(hits)) / len(ground_truth)
    dists = cdist(result, ground_truth, 'euclidean')
    correct_guesses = np.sum(dists<25,axis=0)
    score = (correct_guesses>0).mean()
    return score

它返回结果中也存在的ground_truth中的颜色比例。 在您的示例中,得分为1。