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

2024-10-02 02:37:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这是我的函数,我得到了以下错误:TypeError:'int'object没有属性'getitem,在sorted_by_dist=sorted(colorMap,key=lambda tup:tup[0])

# 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

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


Tags: key函数距离source列表by排序颜色
2条回答

您正在将colorMap构建为一个大的一维元组,第一个索引是int。所以你的lambda被传递了一个int,然后你试着去索引它。在

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

colorMap = []
...
    dist = dist_3d(colors[i], source)
    colorMap.append((dist, colors[i]))

在排序颜色的方法方面,我实际上使用了一个^{} module来进行排序,加载了我所有的RGB元组。然后我可以向它请求与给定颜色元组最接近的N种颜色:

^{pr2}$

错误是因为tupint__getitem__[]运算符的名称。在

但是,看起来你的函数所做的只是根据与某个参考颜色之间的距离对一系列颜色进行排序。而且,您已经实现了dist_3d。既然它能起作用,那么对颜色进行分类就简单多了。按位置排序:

colors.sort(key=lambda color: dist_3d(color, reference_color))

或作为新列表:

^{pr2}$

我可以告诉你,在你的函数中不需要构建元组和循环之类的东西。在

相关问题 更多 >

    热门问题