2012-03-14 15 views
33

Quiero convertir una tupla color a un nombre de color, como 'amarillo' o 'azul'Convertir RGB color para identificar el color Inglés, como 'verde' con Python

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

¿Hay una manera simple en Python para hacer esto?

+1

Creo que encontré los droides que está buscando ... http://pypi.python.org/pypi/webcolors/1.3#conversions-from-integer-rgb-triplets – mVChr

+1

No sé si ya hay una solución para esto, pero cualquier mapeo será necesariamente heurístico y totalmente subjetivo ... ¡Interesante pregunta, sin embargo! –

+2

¿Desea _precise_ nombres de colores o aproximaciones? Por ejemplo, "verde" es (obviamente) '(0,255,0)'. ¿Qué le gustaría que fuera 'color ((0,254,0))'? – katrielalex

Respuesta

53

Parece que webcolors le permitirá hacer esto:

rgb_to_name (rgb_triplet, espec = 'CSS3')

Convierte un 3-tupla de números enteros, adecuado para su uso en un rgb () color triplete, a su correspondiente nombre de color normalizado, si existe tal nombre; los valores válidos son html4, css2, css21 y css3, y el valor predeterminado es css3.

Ejemplo:

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

es viceversa-poder:

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

para encontrar el nombre del color más cercano:

Sin embargo webcolors lanza una excepción si se puede' t encuentra una coincidencia para el color solicitado. He escrito una pequeña corrección que ofrece el nombre más parecido para el color RGB solicitado. Se empareja por distancia euclidiana en el espacio 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 

Salida:

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

Hay un programa llamado pynche que puede cambiar el color de RGB a nombre en Inglés para Python.

Puede intentar utilizar el método ColorDB.nearest() en ColorDB.py que puede hacer lo que quiera.

Puede encontrar más información acerca de este método aquí: ColorDB Pynche

1

una solución a su problema consiste en la cartografía de los valores RGB al espacio de color HSL.

Una vez que tenga el color en el espacio de color HSL, puede usar el componente H (matiz) para asignarle el color. Tenga en cuenta que el color es un concepto un tanto subjetivo, por lo que tendría que definir qué rangos de H corresponde a un color dado.

3

Para aquellos que, como yo, quieren un nombre de color más familiar, puede utilizar la CSS 2.1 colour names, también proporcionado por webcolors:

  • aqua: #00ffff
  • negro: #000000
  • azul: #0000ff
  • fucsia: #ff00ff
  • verde: #008000
  • gris: #808080
  • cal: #00ff00
  • marrón: #800000
  • marino: #000080
  • de oliva: #808000
  • púrpura: #800080
  • roja: #ff0000
  • plata: #c0c0c0
  • verde azulado: #008080
  • blanco: #ffffff
  • amarillo: #ffff00
  • naranja: #ffa500

sólo tiene que utilizar una excelente respuesta y código para conseguir el color más cercano de Fraxel, adaptado a 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())] 
Cuestiones relacionadas