Python字符串为一种颜色

时间:2016-06-15 09:07:22

标签: python

我有一个包含数千种不同颜色的数据库。我想将它们映射到列表中的一种颜色。

在这个颜色数据库只有几百之前,我用类似下面的代码来管理它。现在这已经变得无法维护,因为这个未分类颜色的数据库正在增长,每周都需要花费很多时间才能进行映射。

我如何改进这个或什么是更好的方法?

mapped_colours = ['Red', 'Green', 'Yellow', 'Blue', 'White', 'Black', 'Pink', 'Purple'...]

colour_map_dict = {
    'olive': 'Green',
    'khaki': 'Green'
}

def classify_colour(colour):
    for mp in mapped_colours:
        if mp.lower() in colour.lower():
            return mp

    for map, colour in colour_map_dict.items():
        if map in colour.lower():
            return colour

以下是数据的示例。

 Resin Dark Wash Indi
 Filtered Canyon
 999 Black
 Winter White/Dove Grey
 Midnight/min
 White & black
 Green/White
 Red/White
 Multicolor
 royal blue
 Black Plum Grey
 Rose/ Gold
 Red And White
 Offwht/Gg
 Black Gunmetal
 Berry/Black
 Caramel
 Blue Stone Bleached
 All Tan
 Pale Blush
 Tee
 White / Multi
 00-black
 Flat Foundation
 Baby Blue
 Beige Melange

2 个答案:

答案 0 :(得分:3)

我从一个体面的颜色字典开始,将名称映射到给定颜色空间中的颜色定义(如RGB或CMYK或HSV)。互联网上有各种套装;你必须事先做好工作才能获得它们并将每个数据标准化以使用相同的颜色空间。您可以获得的资源越多,您的映射就越丰富;你的输入集中似乎有很多时尚色彩(paint?cloth?),而(商业)时尚通过发明新的颜色名称来永远地试图区分。

因为颜色空间是有限的,所以您可以通过算法将该空间划分为一组有限的组。然后,每个颜色名称将自动映射到给定的组。

环顾一下,一个好的起点是Wikipedia lists of colour names。即使在基本HTML表单中,compact list也应该很容易机器解析,或者您可以使用MediaWiki API来获取更容易解析的原始格式。然后可能添加other standardised colour name dictionaries;这里的目标是获得尽可能多的名称​​所有映射到相同的颜色空间

我将这些名称存储在数据库表中,并且有一个简单的数学公式,可以将颜色空间划分为基本组。这样,表格中的任何颜色都可以映射到(例如)RGB,RGB可以映射到简单名称。

接下来,build a simple spell-checker trained on your database of names,然后通过第一个输入您的输入。你有一些非常难以处理的数据,但训练有素的颜色名称拼写检查器可能会将 Offwht / Gg 清理成可以匹配的东西。并使用natural text search查找部分匹配。

请注意,如果您的图片数据包含您收到的这些颜色名称,则会找到most prevalent colour in that image,然后您有另一个名称(来自您的输入数据) - >要使用的颜色空间映射。

答案 1 :(得分:1)

一旦有了一个大型名称数据库来纠正答案(参见Martijn的答案),你可以使用该数据库来训练分类算法,例如来自scikit-learn的算法:

#!/usr/bin/env python3

from sklearn import svm
from sklearn.feature_extraction.text import CountVectorizer

mapped_colours = ['Red', 'Green', 'Yellow', 'Blue', 'White', 'Black', 'Pink', 'Purple']

colour_map = [
    ('olive', 'Green'),
    ('khaki', 'Green'),
    ('snow white', 'White'),
    ('alice white', 'White'),
    ('pale blush', 'Pink'),
    ('baby blue', 'Blue'),
    ('midnight', 'Blue'),
    # ...and so on and so on - you'll need a lot of these
]

# A classifier classifies inputs into categories (colors in this case)
clf = svm.SVC(gamma=0.001, C=100.)

# A vectorizer turns strings into arrays which can be used as input
vectorizer = CountVectorizer()

# Train both the classifier and the vectorizer. This can take some time.
training = vectorizer.fit_transform([k for (k, v) in colour_map])
clf.fit(training, [mapped_colours.index(v) for (k, v) in colour_map])

# Predict some colors!
while True:
    query = input('Enter a color: ')
    guess = clf.predict(vectorizer.transform([query]))[0]
    print('Maybe', mapped_colours[guess])

示例运行:

  

输入颜色:雪
  也许白色   输入颜色:深卡其布
  也许是绿色   输入颜色:婴儿卧室
  也许是蓝色

如果您的输入数据已经是RGB格式,那么您也可以让您的模型尝试预测RGB颜色,并在那里工作。

由于输入非常短,分类器可能不会非常智能,但如果数据库足够大,它可能会使添加颜色的工作更容易:如果分类器正确猜测,只需将其猜测添加为一种颜色。如果没有,您仍然需要手动对其进行分类,但分类器将在以后的运行中找到正确的答案。

免责声明:我不确定SVC是否适合您的问题,但它可能足够好并值得一试。