状态: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。我可以查看模块/库源代码的任何语言都可以。
答案 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))
>>>