2012-03-14 311 views
33

我想一个颜色元组转换为一种颜色的名称,如“黄色”或“蓝色”转换RGB颜色英文颜色的名称,如与Python

>>> im = Image.open("test.jpg") 
>>> n, color = max(im.getcolors(im.size[0]*im.size[1])) 
>>> print color 
(119, 172, 152) 

“绿色”是否有一个简单的方法python来做到这一点?

+1

我想我找到了你正在寻找的机器人...... http://pypi.python.org/pypi/webcolors/1.3#conversions-from-integer-rgb-triplets – mVChr 2012-03-14 00:19:32

+1

我不知道这是否已经有解决方案,但是任何这样的映射都必然是启发式的,并且完全是主观的......虽然有趣的问题! – 2012-03-14 00:21:24

+2

你想_precise_颜色名称或近似值?例如,“绿色”显然是(0,255,0)'。你想要什么颜色((0,254,0))? – katrielalex 2012-03-14 00:25:05

回答

53

它看起来像webcolors将允许你这样做:

rgb_to_name(rgb_triplet,规格= 'CSS3')

转换整数3元组,适合使用在RGB( )颜色三元组,如果存在任何此类名称,则将其转换为其对应的标准化颜色名称;有效值为html4,css2,css21和css3,默认值为css3。

例子:

>>> rgb_to_name((0, 0, 0)) 
'black' 

是反之亦然-能够:

>>> name_to_rgb('navy') 
(0, 0, 128) 

要找到最接近的颜色名称:

然而webcolors如果可以”抛出一个异常找到所需颜色的匹配。我写了一个小小的修复程序,为请求的RGB颜色提供最接近的匹配名称。它与RGB空间中的欧几里德距离相匹配。

import webcolors 

def closest_colour(requested_colour): 
    min_colours = {} 
    for key, name in webcolors.css3_hex_to_names.items(): 
     r_c, g_c, b_c = webcolors.hex_to_rgb(key) 
     rd = (r_c - requested_colour[0]) ** 2 
     gd = (g_c - requested_colour[1]) ** 2 
     bd = (b_c - requested_colour[2]) ** 2 
     min_colours[(rd + gd + bd)] = name 
    return min_colours[min(min_colours.keys())] 

def get_colour_name(requested_colour): 
    try: 
     closest_name = actual_name = webcolors.rgb_to_name(requested_colour) 
    except ValueError: 
     closest_name = closest_colour(requested_colour) 
     actual_name = None 
    return actual_name, closest_name 

requested_colour = (119, 172, 152) 
actual_name, closest_name = get_colour_name(requested_colour) 

print "Actual colour name:", actual_name, ", closest colour name:", closest_name 

输出:

Actual colour name: None , closest colour name: cadetblue 
9

有一个名为pynche程序,它可以改变RGB用英语颜色名称为Python。

您可以尝试使用方法ColorDB.nearest()ColorDB.py,它可以做你想做的。

您可以找到有关此方法在这里更多的信息:ColorDB Pynche

1

一个解决问题的方法包括在RGB值映射到HSL色彩空间。

一旦在HSL色彩空间中有颜色,就可以使用H(色相)组件将其映射为颜色。请注意,颜色是一种有点主观的概念,所以您必须定义H的哪个范围对应给定的颜色。

3

对于那些谁和我一样,希望有一个更熟悉的颜色名称,你可以使用CSS 2.1 colour names,还webcolors提供:

  • AQUA:#00ffff
  • 黑色:#000000
  • 蓝色:#0000ff
  • 紫红色:#ff00ff
  • 绿色:#008000
  • 灰色:#808080
  • 石灰:#00ff00
  • 栗色:#800000
  • 海军:#000080
  • 橄榄:#808000
  • 紫色:#800080
  • 红:#ff0000
  • 银:#c0c0c0
  • 水鸭:#008080
  • 白:#ffffff
  • 黄:#ffff00
  • 橙色:#ffa500

只要使用飞梭的出色答卷,并为获得最接近的颜色代码,适用于CSS 2.1:

def get_colour_name(rgb_triplet): 
    min_colours = {} 
    for key, name in webcolors.css21_hex_to_names.items(): 
     r_c, g_c, b_c = webcolors.hex_to_rgb(key) 
     rd = (r_c - rgb_triplet[0]) ** 2 
     gd = (g_c - rgb_triplet[1]) ** 2 
     bd = (b_c - rgb_triplet[2]) ** 2 
     min_colours[(rd + gd + bd)] = name 
    return min_colours[min(min_colours.keys())]