我正致力于从科学论文中的数据中提取信息,将图像本身的图像处理与其标题上的自然语言处理相结合。
我已进入一个阶段,我在图像中有孤立的对象,并为每个对象获得“平均”颜色(在RGB和Lab颜色空间中,不确定什么是最好的)。从标题中,我已经解析了一个对象列表,以及用于描述它们的颜色名称。
所以我有两个清单:
names = ['Red', 'Brown', 'Yellow', 'Magenta'];
rgbs = [ (249,0,252), (253,0,1), (250,248,60), (140,70,20)];
我正在试图找出一种确定名称和值之间最佳配对的自动方法。考虑到这一点,我认为最好首先使用所有常用名称的查找表将名称转换为“已接受”的rgb值。然后我可以计算每个rgb值和每个名称rgbs之间的“距离”(欧几里得?)。在这个阶段,不知怎的,我应该能够利用这些距离找到最佳配对,但我不确定究竟是怎样的。
有没有人有任何想法,或者知道任何可能为此提供有用工具的库?
答案 0 :(得分:2)
尝试阅读this work,看起来它解决了类似的问题。
你能从不同的数字中获得这样的列表对(名称 - RGB值)吗? 如果是这样,通过交叉这些列表,您可能会隔离一对颜色名称,这对于一堆对(只有这种颜色)是常见的,然后尝试找到“尽可能通用”的RGB三元组(最多有点失真) 您可以使用此消除过程,直到您隔离所有颜色。
例如:假设你有
{ ['Red','Green'], {[1 0 0], [0 1 0]} }
{ ['Red','blue'] , {[.9 .1. 1], [ .2 .3 .9] }
交叉点中有“红色”,[1 0 0],[。9 .1 .1]是最接近的颜色。
答案 1 :(得分:1)
我碰巧需要一个value->名称功能,并发现这里的帖子很有帮助。这就是我想出来的:
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引用的工作虽然非常有趣,但意味着我的算法在某些颜色上会失败。然而,这种方法背后的想法是为尽可能多的颜色命名,以尽量减少这种影响。例如,您甚至可以将多个颜色值映射为“红色”。