颜色分类库

时间:2011-07-27 15:25:12

标签: python colors python-3.x

状态:I am developing my own library


问题:

是否有可以进行颜色分类的库?

我想象这样的工作流程:

>>> import colorclassification
>>> classifier = colorclassification.Classifier
>>> color = classifier.classify_rgb([255, 255, 0])
['yellow']
>>> color = classifier.classify_rgb([255, 170, 0])
['orange']

库不一定是python。我可以查看模块/库源代码的任何语言都可以。

1 个答案:

答案 0 :(得分:10)

你能做到这一点的一种方法就是找到“最接近”的颜色。假设我们有一组颜色,它不必覆盖所有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),}

让我们定义一种机制,通过“最接近的”颜色告诉我们真正意味着什么。在这种情况下,我将使用一个简单的笛卡尔距离,但任何可以比较两种颜色的笛卡尔距离都会有所不同。

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))
>>>