Je souhaite convertir un tuple de couleur en un nom de couleur, comme "jaune" ou "bleu"
>>> im = Image.open("test.jpg")
>>> n, color = max(im.getcolors(im.size[0]*im.size[1]))
>>> print color
(119, 172, 152)
Existe-t-il un moyen simple de faire cela python?
Il ressemble à webcolors vous permettra de faire ceci:
rgb_to_name (rgb_triplet, spec = 'css3')
Convertir un triplet de 3 entiers, utilisable dans un triplet de couleurs rgb (), en son nom de couleur normalisé correspondant, si un tel nom existe; les valeurs valides sont html4, css2, css21 et css3, et la valeur par défaut est css3.
Exemple:
>>> rgb_to_name((0, 0, 0))
'black'
il est vice-versa:
>>> name_to_rgb('navy')
(0, 0, 128)
Cependant webcolors
lève une exception s'il ne trouve pas de correspondance pour la couleur demandée. J'ai écrit un petit correctif qui fournit le nom correspondant le plus proche pour la couleur RVB demandée. Il correspond par distance euclidienne dans l'espace RVB.
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
Production:
Actual colour name: None , closest colour name: cadetblue
Il existe un programme appelé pynche qui peut changer RVB en nom de couleur en anglais pour Python.
Vous pouvez essayer d'utiliser la méthode ColorDB.nearest()
dans ColorDB.py
qui peut faire ce que vous voulez.
Vous pouvez trouver plus d'informations sur cette méthode ici: ColorDB Pynche
Pour ceux qui, comme moi, veulent un nom de couleur plus familier, vous pouvez utiliser le noms de couleurs CSS 2.1 , également fourni par webcolors
:
#00ffff
#000000
#0000ff
#ff00ff
#008000
#808080
#00ff00
#800000
#000080
#808000
#800080
#ff0000
#c0c0c0
#008080
#ffffff
#ffff00
#ffa500
Utilisez simplement l'excellente réponse et le code de fraxel pour obtenir la couleur la plus proche, adaptée à 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())]
Une solution à votre problème consiste à mapper les valeurs RVB à l'espace colorimétrique HSL.
Une fois que vous avez la couleur dans l'espace colorimétrique HSL, vous pouvez utiliser le composant H (teinte) pour lui assigner la couleur. Notez que la couleur est un concept quelque peu subjectif, vous devez donc définir quelles plages de H correspondent à une couleur donnée.