Python-如何根据颜色与3D(r,g,b)空间中的源颜色的“距离”对颜色列表进行排序?

Bri*_*ian 6 python sorting tuples list

这是我用Python编写的应用程序的基本步骤:

  1. 生成随机颜色列表
  2. 创建每种颜色的映射,并根据该颜色到3D(r​​,g,b)空间中“源颜色”的距离进行索引。(例如,橙色(255,150,0)比深蓝色(0,0,100)更接近红色(255,0,0)。到目前为止,我已经有了格式(距离,颜色)的元组列表)。
  3. 根据我计算出的距离(从最低到最高)对元组列表进行排序。
  4. 检索排序的颜色列表

这是我的函数,出现以下错误:TypeError:'int'对象在行sorted_by_dist = sorted(colorMap,key = lambda tup:tup [0])没有属性'_ getitem _'

# Sorts a list of colors according to distance from the source color
def sort_colors(colors, source):
    colorMap = ()
    sortedColors = list()
    for i in range(len(colors)):
        dist = dist_3d(colors[i], source)
        colorMap = colorMap + (dist, colors[i])

    sorted_by_dist = sorted(colorMap, key=lambda tup: tup[0])

    for (d, c) in sorted_by_dist:
        sortedColors.append(c)

    return sortedColors
Run Code Online (Sandbox Code Playgroud)

假设我的dist_3d()函数正确并返回一个整数值(它是和确实),我在做什么错呢?我不明白

jdi*_*jdi 3

您正在将其构建colorMap为一个大的单维元组,第一个索引是int. 因此,您lambda将被传递int,然后您尝试对其进行索引。

您可能需要一个元组列表:

colorMap = []
...
    dist = dist_3d(colors[i], source)
    colorMap.append((dist, colors[i]))
Run Code Online (Sandbox Code Playgroud)

就颜色排序方法而言,我实际上使用了一个kdtree模块,加载了我所有的 RGB 元组。然后我可以要求它提供与给定颜色元组最接近的 N 个颜色:

from kdtree import KDTree

colors = [(10,10,10),(250,50,5),(100,50,20)]
query_color = (175, 25, 50)

tree = KDTree.construct_from_data(data)
# query the 2 closest colors
nearest = tree.query(query_point=query_color, t=2)
Run Code Online (Sandbox Code Playgroud)