2012-03-14 308 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())]