web-dev-qa-db-ja.com

Pythonで 'green'のようにRGBカラーを英語のカラー名に変換

色のタプルを「黄色」や「青」などの色の名前に変換したい

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

pythonでこれを行う簡単な方法はありますか?

54
MikeVaughan

webcolors のように見えるので、これを行うことができます:

rgb_to_name(rgb_triplet、spec = 'css3')

Rgb()カラートリプレットでの使用に適した整数の3タプルを、対応する正規化されたカラー名があれば、その名前に変換します。有効な値は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
83
fraxel

Python用に英語でRGBをカラー名に変更できるpyncheと呼ばれるプログラムがあります。

_ColorDB.py_でメソッドColorDB.nearest()を使用してみてください。

このメソッドの詳細については、こちらをご覧ください: ColorDB Pynche

9
ChapMic

私のように、より身近な色の名前が必要な場合は、 CSS 2.1色名 を使用できます。これもwebcolorsで提供されます。

  • アクア:#00ffff
  • 黒: #000000
  • 青い: #0000ff
  • フクシア:#ff00ff
  • 緑: #008000
  • グレー: #808080
  • ライム: #00ff00
  • あずき色:#800000
  • ネイビー:#000080
  • オリーブ: #808000
  • 紫の: #800080
  • 赤: #ff0000
  • シルバー:#c0c0c0
  • ティール:#008080
  • 白い: #ffffff
  • 黄: #ffff00
  • オレンジ: #ffa500

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

問題の解決策は、RGB値をHSL色空間にマッピングすることです。

HSL色空間に色ができたら、H(色相)コンポーネントを使用して色をマッピングできます。色はやや主観的な概念であるため、Hのどの範囲が特定の色に対応するかを定義する必要があります。

2
Alceu Costa