实现此目的的一种方法是找到“最接近”的颜色。假设我们有一个颜色集合,它不必覆盖所有 16777216 个可能的 RGB 值,它甚至不需要是 RGB 格式,但为了简单起见,它可能看起来像这样:
colors = {'red': (255,0,0),
'green': (0,255,0),
'blue': (0,0,255),
'yellow': (255,255,0),
'orange': (255,127,0),
'white': (255,255,255),
'black': (0,0,0),
'gray': (127,127,127),
'pink': (255,127,127),
'purple': (127,0,255),}
让我们定义一个机制来告诉我们真正的内容mean通过“最接近”的颜色。在本例中,我将使用简单的笛卡尔距离,但任何可以比较两种颜色的相似程度的东西都可以。
def distance(left, right):
return sum((l-r)**2 for l, r in zip(left, right))**0.5
class NearestColorKey(object):
def __init__(self, goal):
self.goal = goal
def __call__(self, item):
return distance(self.goal, item[1])
这实际上就是我们所需要的。我们可以使用内置的min()
(如果您的相似性函数为更相似的颜色返回更高的值,则为 max)
>>> min(colors.items(), key=NearestColorKey((10,10,100)))
('black', (0, 0, 0))
>>> min(colors.items(), key=NearestColorKey((10,10,200)))
('blue', (0, 0, 255))
>>> min(colors.items(), key=NearestColorKey((100,10,200)))
('purple', (127, 0, 255))
>>>