ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

Pythonで任意の整数を色相に割り当てる

f:id:twx:20190624214400p:plain
色相環 (wikipediaより引用)

色相環とは

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値に変換して、★の色を変えながら描画しているだけです。 結果は以下のようになります。

f:id:twx:20190624222735p:plain
色相グラデーションの出力テスト

きれいにグラデーションになりました!

今回はPythonで任意の整数を色相に割り当ててみました。良い記事だと思っていただいた方は、SNSでのシェア、ブログからのリンク、「読者になる」ボタンのクリック、「★」ボタンのクリック、よろしくお願いします!

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu