Подтвердить что ты не робот

Преобразуйте RGB-цвет в английское имя цвета, например "зеленый" с Python

Я хочу преобразовать цветовой кортеж в имя цвета, например, "желтый" или "синий"

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

Есть ли простой способ в python сделать это?

4b9b3361

Ответ 1

Похоже, webcolors позволит вам сделать это:

rgb_to_name (rgb_triplet, spec = 'css3')

Преобразование 3-х целых целых чисел, подходящих для использования в цветовом триплете rgb(), к соответствующему нормализованному имени цвета, если такое имя существует; допустимыми являются html4, css2, css21 и css3, а по умолчанию - css3.

Пример:

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

он наоборот:

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

Чтобы найти ближайшее имя цвета:

Однако webcolors вызывает исключение, если оно не может найти соответствие для запрошенного цвета. Я написал небольшое исправление, которое предоставляет самое близкое совпадающее имя для запрошенного цвета RGB. Он соответствует эвклидову расстоянию в пространстве 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

Вывод:

Actual colour name: None , closest colour name: cadetblue

Ответ 2

Существует программа pynche, которая может изменить RGB на имя цвета на английском языке для Python.

Вы можете попробовать использовать метод ColorDB.nearest() в ColorDB.py, который может делать то, что вы хотите.

Дополнительную информацию об этом методе можно найти здесь: ColorDB Pynche

Ответ 3

Для тех, кто, как и я, хочет более знакомое имя цвета, вы можете использовать имена цветов CSS 2.1, также предоставляемые webcolors:

  • aqua: #00ffff
  • черный: #000000
  • синий: #0000ff
  • fuchsia: #ff00ff
  • зеленый: #008000
  • серый: #808080
  • lime: #00ff00
  • maroon: #800000
  • ВМФ: #000080
  • olive: #808000
  • фиолетовый: #800080
  • красный: #ff0000
  • серебро: #c0c0c0
  • teal: #008080
  • белый: #ffffff
  • желтый: #ffff00
  • оранжевый: #ffa500

Просто используйте fraxel отличный ответ и код для получения самого близкого цвета, адаптированного к 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

Решение вашей проблемы заключается в отображении значений RGB в цветовое пространство HSL.

После того, как у вас есть цвет в цветовом пространстве HSL, вы можете использовать компонент H (оттенок), чтобы отобразить его цвет. Обратите внимание, что цвет является несколько субъективной концепцией, поэтому вам нужно будет определить, какие диапазоны H соответствуют заданному цвету.

Ответ 5

Если вы не можете найти встроенный способ Python для этого, я googled вокруг и нашел это:

http://www.psychopy.org/epydoc/psychopy.colors-pysrc.html#L305

Они, похоже, соответствуют цветам с CSS.

Существует также словарь шестнадцатеричных имен для тех, кто ищет это.