1

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

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

所以我有两个列表:

names = ['Red', 'Brown', 'Yellow', 'Magenta'];
rgbs = [ (249,0,252), (253,0,1), (250,248,60), (140,70,20)];

我试图找出一种自动化方法来确定名称和值之间的最佳配对。考虑到这一点,我认为最好从使用所有常用名称的查找表开始,将名称转换为其“可接受的”rgb 值。然后我可以计算出每个 rgb 值和每个名称 rgbs 之间的“距离”(欧几里得?)。在这个阶段,我应该能够以某种方式使用这些距离来找到最佳配对,但我不确定具体如何。

有没有人有任何想法,或者知道任何可能为此提供有用工具的库?

4

2 回答 2

2

尝试阅读这项工作,它看起来解决了一个非常相似的问题。

你能从不同的数字中获得这样的列表对(名称 - RGB-values)吗?
如果是这样,通过与这些列表相交,您可能会分离出一组对(仅此颜色)共有的颜色名称,然后尝试找到“尽可能常见”的 RGB 三元组(最多有点失真)。
您可以使用此消除过程,直到您隔离所有颜色。

例如:假设你有

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

您在交叉路口有“红色”,并且 [1 0 0], [.9 .1 .1] 是最接近的颜色。

于 2013-02-05T16:27:09.170 回答
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)

它计算给定参考表上的最小二乘差(我刚刚从互联网上下载了一个),以将名称与给定的颜色值配对。就调整人类的颜色感知而言,我并没有真正做太多的科学工作,但我得到的效果相当不错。希望这对某人有用,因为您可以随意修改评分功能。

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

于 2013-12-26T21:16:31.997 回答