Convertir une couleur RGB en nom de couleur français, comme 'vert' en Python
je veux convertir un tuple 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)
y a-t-il un moyen simple en python pour faire cela?
4 réponses
Il ressemble à webcolors vous permettra de faire ceci:
rgb_to_name (rgb_triplet, spec='css3')
convertissez un 3-tuple d'entiers, adapté à une utilisation dans un triplet de couleur RGB (), à 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-mesure:
>>> name_to_rgb('navy')
(0, 0, 128)
à trouver le nom de couleur le plus proche:
Toutefois webcolors
soulève une exception si elle ne peut pas trouver une correspondance pour la couleur demandée. J'ai écrit un petit correctif qui fournit le nom correspondant le plus proche pour la couleur RGB demandée. Il correspond par la distance euclidienne dans l'espace 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
Sortie:
Actual colour name: None , closest colour name: cadetblue
il existe un programme appelé pynche qui peut changer RGB en nom de couleur en anglais pour Python.
Vous pouvez essayer d'utiliser la méthode ColorDB.nearest()
ColorDB.py
qui peut faire ce que vous voulez.
pour ceux qui, comme moi, veulent un nom de couleur plus familier, vous pouvez utiliser le CSS 2.1 noms de couleur, également fourni par webcolors
:
- aqua:
#00ffff
- noir:
#000000
- bleu:
#0000ff
- fuchsia:
#ff00ff
- vert:
#008000
- gris:
#808080
- chaux:
#00ff00
- bordeaux:
#800000
- marine:
#000080
- olive:
#808000
- pourpre:
#800080
- rouge:
#ff0000
- argent:
#c0c0c0
- teal:
#008080
- blanc:
#ffffff
- jaune:
#ffff00
- orange:
#ffa500
il suffit d'utiliser l'excellente réponse et le code de fraxel pour obtenir la couleur la plus proche, adapté à 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 à faire correspondre les valeurs RVB à l'espace de couleur HSL.
une fois que vous avez la couleur dans L'espace de couleur HSL, vous pouvez utiliser le composant H (teinte) pour lui attribuer la couleur. Notez que la couleur est un peu subjectif, donc vous aurez à définir les gammes de H correspond à une couleur donnée.