Konwertuj kolor RGB na angielską nazwę koloru, np.

Chcę przekonwertować krotkę koloru na nazwę koloru, taką jak "żółty" lub "niebieski"

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

Czy jest na to prosty sposób w Pythonie?

Author: Ripon Al Wasim, 2012-03-14

5 answers

Wygląda na to, że webcolors pozwoli Ci to zrobić:

Rgb_to_name (rgb_triplet, spec='css3')

Konwertuje trzy krotki liczb całkowitych, odpowiednie do użycia w trójkącie kolorów RGB (), na odpowiadającą im znormalizowaną nazwę koloru, jeśli taka nazwa istnieje; poprawnymi wartościami są html4, css2, css21 i css3, a domyślną wartością jest css3.

Przykład:

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

Jest odwrotnie-zdolny:

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

Aby znaleźć najbliższą nazwę koloru:

Jednakże webcolors wyświetla wyjątek, jeśli nie może znaleźć dopasowania dla żądanego koloru. Napisałem małą poprawkę, która dostarcza najbliższą pasującą nazwę dla żądanego koloru RGB. Odpowiada odległości euklidesowej w przestrzeni 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

Wyjście:

Actual colour name: None , closest colour name: cadetblue
 102
Author: fraxel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 10:13:11

Istnieje program o nazwie pynche, który może zmienić nazwę RGB na nazwę koloru w języku angielskim dla Pythona.

Możesz spróbować użyć metody ColorDB.nearest() W ColorDB.py, która może zrobić to, co chcesz.

Więcej informacji na temat tej metody znajdziesz tutaj: ColorDB Pynche

 11
Author: ChapMic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 00:26:02

Dla tych, którzy, podobnie jak ja, chcą bardziej znanej nazwy kolorów, możesz użyć CSS 2.1 nazw kolorów , również dostarczonych przez webcolors:

  • aqua: #00ffff
  • czarny: #000000
  • Niebieski: #0000ff
  • Fuksja: #ff00ff
  • zielony: #008000
  • szary: #808080
  • lime: #00ff00
  • bordowy: #800000
  • navy: #000080
  • olive: #808000
  • fioletowy: #800080
  • czerwony: #ff0000
  • srebro: #c0c0c0
  • teal: #008080
  • Biały: #ffffff
  • żółty: #ffff00
  • pomarańczowy: #ffa500
Po prostu użyj doskonałej odpowiedzi i kodu fraxela, aby uzyskać najbliższy kolor, dostosowany do 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())]
 10
Author: fiatjaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 22:49:05

Rozwiązanie problemu polega na mapowaniu wartości RGB do przestrzeni kolorów HSL.

Gdy masz kolor w przestrzeni kolorów HSL, możesz użyć komponentu H (hue)do odwzorowania koloru. Zauważ, że kolor jest nieco subiektywnym pojęciem, więc będziesz musiał określić, które zakresy H odpowiadają danemu kolorowi.

 3
Author: Alceu Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 00:37:58

Najlepsze rozwiązanie, jakie znalazłem, aby rozwiązać ten problem, to to Dostarczone przez tux21b w tym poście:
Znajdź nazwę koloru z szesnastkowego kodu koloru
Z poprawką, którą zrobiłem (aby uniknąć podziału przez błąd zerowy).
Jest to (z mojego zrozumienia) obliczenia przybliżenia, które nie wymaga ładowania dużego zestawu tabeli danych, aby uzyskać zbliżającą się wartość, a które pozwalają ustawić własny zestaw potrzebnych kolorów.

 0
Author: CutMaster Prod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-30 13:43:43