色相環とは
HSVカラーモデルとも言われます。赤、緑、青の色度で色を表現するRGBモデルの代わりに、色相(H)、彩度(S)、明度(V)の3値で表現するモデルです。 色相は、上手の円柱においてどの方角の色かを表します。彩度は色の鮮やかさのことで、これが大きいほど灰色から最も遠い鮮やかな色になり、これが小さいほど灰色に近くなります。明度は色の明るさのことで、これが大きいほど白に近づき、小さいほど黒に近づきます。
Pythonで整数を色相に変換する
上図のように色相は円で表されます。赤から反時計回りに30度回ると黄色、もう30度回ると緑といった具合に、角度と色が対応しています。したがって360度回転すると同じ色に戻ります。言い換えると、1度、2度、3度、…、360度のそれぞれは何らかの色に対応付いていると言えます。
ここでは、任意の数(のリスト)を色相に変換する方法をご紹介します。
import colorsys def int2hue(integer, in_max=255, out_max=255, is_alpha=False): if is_alpha: return tuple( float(v * out_max) for v in colorsys.hsv_to_rgb(integer/in_max, 1, 1) ) + (out_max,) else: return tuple( float(v * out_max) for v in colorsys.hsv_to_rgb(integer/in_max, 1, 1) )
この関数では、任意の整数を受け取り、それが彩度・明度が共にMAXの色相環においてどこに位置しているかをRGBモデルで返します。 上で述べたように0を代入すると赤(255,0,0)、30なら黄色(255,255,0)、60なら緑(0,255,0)が得られるといった感じです。
360で1周したいなら引数in_max=360
とします。また、出力されるRGB値のMAXが0〜255ではなく0〜1.0にしたい場合は引数out_max=255
としてください。
アルファチャンネルも含めて出力したい場合は引数is_alpha=True
としてください。
テストしてみます
色相のグラデーションをつけて256個の★を描画してみます。
from IPython.display import HTML htmls = [] for i in range(0, 256): rgb = int2hue(i) if i % 16 == 0 and i > 0: htmls.append("<br>") htmls.append("<span style='color: rgb" + str(rgb) + ";'>★</span>") HTML(''.join(htmls))
forループで0, 1, 2, ..., 255の整数をそれぞれRGB値に変換して、★の色を変えながら描画しているだけです。 結果は以下のようになります。
きれいにグラデーションになりました!
今回はPythonで任意の整数を色相に割り当ててみました。良い記事だと思っていただいた方は、SNSでのシェア、ブログからのリンク、「読者になる」ボタンのクリック、「★」ボタンのクリック、よろしくお願いします!