Python 将颜色名称和值配对

Python 将颜色名称和值配对,python,matlab,image-processing,colors,Python,Matlab,Image Processing,Colors,我正致力于从科学论文中的图形中提取信息,将图形本身的图像处理与标题的自然语言处理相结合 我已经到了这样一个阶段:我在图像中有孤立的对象,每个对象都有一个“平均”颜色(在RGB和Lab颜色空间中,还不确定什么是最好的)。从标题中,我解析了对象列表,以及用于描述它们的颜色名称 所以我有两个清单: names = ['Red', 'Brown', 'Yellow', 'Magenta']; rgbs = [ (249,0,252), (253,0,1), (250,248,60), (140,70,2

我正致力于从科学论文中的图形中提取信息,将图形本身的图像处理与标题的自然语言处理相结合

我已经到了这样一个阶段:我在图像中有孤立的对象,每个对象都有一个“平均”颜色(在RGB和Lab颜色空间中,还不确定什么是最好的)。从标题中,我解析了对象列表,以及用于描述它们的颜色名称

所以我有两个清单:

names = ['Red', 'Brown', 'Yellow', 'Magenta'];
rgbs = [ (249,0,252), (253,0,1), (250,248,60), (140,70,20)];
我试图找出一种自动确定名称和值之间最佳配对的方法。考虑到这一点,我认为最好从使用所有常用名称的查找表开始,将这些名称转换为它们的“可接受”rgb值。然后我可以计算出每个rgb值和每个名称rgb之间的“距离”(欧几里德?)。在这个阶段,不知何故,我应该能够使用这些距离来找到最佳配对,但我不确定确切的方式

有没有人有什么想法,或者知道有什么库可以提供有用的工具

试着读一读,它似乎解决了一个类似的问题

您能否从不同的图形中获得这样的列表对(名称-RGB值)?
如果是这样的话,通过与这些列表相交,您可能会分离出一组对共用的颜色名称(仅此颜色),然后尝试找到“尽可能共用”(高达一点失真)的RGB三元组。
在隔离所有颜色之前,可以使用此消除过程

例如:假设你有

{ ['Red','Green'], {[1 0 0], [0 1 0]} }
{ ['Red','blue'] , {[.9 .1. 1], [ .2 .3 .9] }

交叉点处有“红色”,最接近的颜色是[10]、[9.1.1]。

我碰巧也需要一个value->name函数,发现这里的帖子很有用。然而,这是我想到的:

from bs4 import BeautifulSoup
import requests
import sys 

def squ_diff(c1, c2):
    return ((c1 & 0x0000FF) - (c2 & 0x0000FF))**2 +\
           (((c1 & 0x00FF00)>>8) - ((c2 & 0x00FF00)>>8))**2 +\
           (((c1 & 0xFF0000)>>16) - ((c2 & 0xFF0000)>>16))**2

def best_match(c, ref):
    """Find the best match for color c.
    Uses least square to determine fitness.
    """
    diff = squ_diff(0xFFFFFF, 0x000000)
    best = "None"
    for ref_color in ref:
        curr_diff = squ_diff(c, ref_color[1])
        #if curr_diff < 1000:
        #    print curr_diff, ref_color[0], hex(ref_color[1])
        if curr_diff < diff:
            diff = curr_diff
            best = ref_color[0]
    return best

def get_ref():
    """Retreives some reference colors.
    Format:
        [("red", 0xFF0000), ("green", 0x00FF00), ("blue", 0x0000FF)]
    """
    html = requests.get("http://jadecat.com/tuts/colorsplus.html").content
    soup = BeautifulSoup(html)
    return [(e.text[:-6].strip(), int(e.text[-6:], 16)) for e in soup.find_all("td")[2:]]

if __name__ == "__main__":
    """For testing, just provide a hex value as the argument.
    """
    r = get_ref()
    print best_match(int(sys.argv[1], 16), r)
从bs4导入美化组
导入请求
导入系统
def squ_差异(c1、c2):
返回((c1和0x0000FF)-(c2和0x0000FF))**2+\
(((c1&0x00FF00)>>8)-(c2&0x00FF00)>>8))**2+\
(((c1&0xFF0000)>>16)-(c2&0xFF0000)>>16))**2
def最佳匹配(c,参考):
“”“查找颜色c的最佳匹配项。”。
使用最小二乘法确定适合度。
"""
diff=squ_diff(0xFFFFFF,0x000000)
best=“无”
对于ref中的ref_颜色:
curr_diff=squ_diff(c,参考颜色[1])
#如果电流差<1000:
#打印电流差,参考颜色[0],十六进制(参考颜色[1])
如果当前差异<差异:
diff=当前的diff
最佳=参考颜色[0]
回报最好
def get_ref():
“”“检索一些参考颜色。
格式:
[(“红色”,0xFF0000),(“绿色”,0x00FF00),(“蓝色”,0x0000FF)]
"""
html=请求。获取(“http://jadecat.com/tuts/colorsplus.html1.内容
soup=BeautifulSoup(html)
为汤中的e返回[(e.text[:-6].strip(),int(e.text[-6:],16)]。查找所有(“td”)[2:]
如果名称=“\uuuuu main\uuuuuuuu”:
“”“对于测试,只需提供十六进制值作为参数。
"""
r=获取_ref()
打印最佳匹配(int(sys.argv[1],16),r)
它计算给定参考表上的最小平方差(我刚从互联网上取了一个),将名称与给定颜色值配对。就适应人类的颜色感知而言,我并没有做太多的科学研究,但我得到的结果相当不错。希望这对某些人有用,因为您可以随意修改评分函数


Shai引用的工作非常有趣,这意味着我的算法在某些颜色上会失败。然而,这种方法背后的想法是为尽可能多的颜色命名,以尽量减少这种影响。例如,您甚至可以将多个颜色值映射为“红色”。

这里有一些提示:由于该问题中未涉及的部分很小,我想这算是一个重复。是的,我想如果每个“名称rgb”最接近不同的rgb值,那么我可以轻松地将它们配对。但是,我认为如果两个名称最接近相同的值,则需要更复杂的配对算法。然后我需要一些方法来考虑它们的第二个最接近值。是的,我认为消除过程的想法是很好的。因此,首先我使用查找表将每个颜色名称转换为其rgb值。然后,我从名称中找出与给定rgb值最接近的值。我把它们配对,然后消除它们。然后对其余的名字重复,直到我们完成。至于量化任意两个给定颜色值的匹配程度,我的印象是Lab colorspace中的欧几里德距离最好。@MattSwain Lab with Euclidean distance在类似颜色中表现良好。但是,当您比较非常不同的颜色时,颜色空间的作用就不那么重要了(例如,请参见)