web-dev-qa-db-fra.com

Convertir la couleur RVB en nom de couleur anglais, comme «vert» avec Python

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?

54
MikeVaughan

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)

Pour trouver le nom de couleur le plus proche:

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
83
fraxel

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

9
ChapMic

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:

  • aqua: #00ffff
  • noir: #000000
  • bleu: #0000ff
  • Fuchsia: #ff00ff
  • vert: #008000
  • gris: #808080
  • Citron vert: #00ff00
  • marron: #800000
  • marine: #000080
  • olive: #808000
  • violet: #800080
  • rouge: #ff0000
  • argent: #c0c0c0
  • turquoise: #008080
  • blanc: #ffffff
  • jaune: #ffff00
  • orange: #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())]
6
fiatjaf

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.

2
Alceu Costa