颜色分类库

joa*_*oar 4 python colors python-3.x

状态:我正在开发自己的库


题:

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

我想像这样的工作流程:

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

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

Sin*_*ion 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),}
Run Code Online (Sandbox Code Playgroud)

让我们定义一种机制,通过"最接近的"颜色告诉我们真正的意思.在这种情况下,我将使用一个简单的笛卡尔距离,但任何可以比较两种颜色的东西都会有相似之处.

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])
Run Code Online (Sandbox Code Playgroud)

这实际上就是我们所需要的一切.我们可以使用内置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))
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 如果您最终使用笛卡尔距离来比较颜色,则通常应将输入转换为*线性,感知*颜色空间,例如Lab或Yuv.RGB和HSV都不是线性的,因此笛卡尔距离与类似的两种颜色实际上没有多大关系. (6认同)