Преобразование цвета RGB в английское название цвета, например «зеленый» с Python - PullRequest
52 голосов
/ 14 марта 2012

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

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

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

Ответы [ 4 ]

80 голосов
/ 14 марта 2012

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

rgb_to_name (rgb_triplet, spec = 'css3')

Преобразовать три набора целых чисел, подходящих для использования в триплете цвета 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
9 голосов
/ 14 марта 2012

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

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

Вы можете найти больше информации об этом методе здесь: ColorDB Pynche

6 голосов
/ 01 августа 2014

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

  • aqua:#00ffff
  • черный: #000000
  • синий: #0000ff
  • фуксия: #ff00ff
  • зеленый: #008000
  • серый: #808080
  • салатовый: #00ff00
  • бордовый: #800000
  • флот: #000080
  • оливковый: #808000
  • фиолетовый: #800080
  • красный: #ff0000
  • серебро: #c0c0c0
  • чирок: #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())]
2 голосов
/ 14 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...