Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何根据颜色对颜色列表进行排序';s";“距离”;从3D(r、g、b)空间中的源颜色?_Python_List_Sorting_Tuples - Fatal编程技术网

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

Python-如何根据颜色对颜色列表进行排序';s";“距离”;从3D(r、g、b)空间中的源颜色?,python,list,sorting,tuples,Python,List,Sorting,Tuples,下面是我用Python编写的应用程序的基本步骤: 生成随机颜色的列表 创建这些颜色的映射,根据颜色到3D(r、g、b)空间中“源颜色”的距离索引。(例如,橙色(255,150,0)比深蓝(0,0,100)更接近红色(255,0,0)。到目前为止,我已经有了格式(距离,颜色)的元组列表 根据我计算的距离(从最低到最高)对元组列表进行排序 检索已排序颜色的列表 这是我的函数,我得到了以下错误:TypeError:“int”对象在sorted\u by\u dist=sorted(colorMap,k

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

  • 生成随机颜色的列表
  • 创建这些颜色的映射,根据颜色到3D(r、g、b)空间中“源颜色”的距离索引。(例如,橙色(255,150,0)比深蓝(0,0,100)更接近红色(255,0,0)。到目前为止,我已经有了格式(距离,颜色)的元组列表
  • 根据我计算的距离(从最低到最高)对元组列表进行排序
  • 检索已排序颜色的列表
  • 这是我的函数,我得到了以下错误:TypeError:“int”对象在sorted\u by\u dist=sorted(colorMap,key=lambda tup:tup[0])行上没有属性“\u getitem”


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

    您正在将您的
    颜色映射
    构建为一个大的一维元组,第一个索引是
    int
    。因此您的
    lambda
    被传递一个
    int
    ,然后您尝试索引到其中

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

    colorMap = []
    ...
        dist = dist_3d(colors[i], source)
        colorMap.append((dist, colors[i]))
    
    在对颜色进行排序的方法方面,我实际上使用了a,加载了我所有的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)
    

    错误是因为
    tup
    是一个
    int
    \uuu getitem\uuu
    []
    运算符的名称

    但是,看起来您的函数所做的只是根据与某个参考颜色的距离对颜色列表进行排序。而且,您已经实现了
    dist_3d
    。考虑到它的工作原理,那么对颜色进行排序要简单得多。对它们进行适当排序:

    colors.sort(key=lambda color: dist_3d(color, reference_color))
    
    或作为新列表:

    sorted_colors = sorted(unsorted_colors, key=lambda color: dist_3d(color, reference_color))
    

    我可以告诉你,你的函数中不需要所有元组构建、循环和其他东西。

    RGB三元组之间的颜色距离从根本上是错误的,与代码是否正确无关。是的,我理解这一点。它也与整个应用程序无关……现在它只是一个占位符函数,而我得到了我的其他代码片段正在工作。我脑海中第一个作为占位符出现的“与颜色有关的事情”碰巧发生了。@mmgp,你为什么这么说?实验室颜色空间可能更好,但RGB不是太破旧。@Markransem真的吗?RGB的距离函数是什么?@mmgp:
    sqrt((r1-r2)**2+(g1-g2)**2+(b1-b2)**2)
    sqrt
    是可选的。非常感谢!我以前从未听说过k-d树……令人震惊!我很可能会使用它,因为我越来越多地使用颜色。我的应用程序现在按设计工作,但要注意的是,我的dist_3d实际上没有做正确的事情,但它作为占位符工作得非常完美。
    sorted_colors = sorted(unsorted_colors, key=lambda color: dist_3d(color, reference_color))