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?

45
demandé sur Ripon Al Wasim 2012-03-14 04:14:19

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
65
répondu fraxel 2012-03-14 10:13:11

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.

ColorDB Pynche

9
répondu ChapMic 2012-03-14 00:26:02

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())]
4
répondu fiatjaf 2014-07-31 22:49:05

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.

1
répondu Alceu Costa 2012-03-14 00:37:58