当ブログは移転しました。

ProcessingでHSLを扱う

僕の所属する研究室では顔画像を処理する研究が行われている。顔画像処理をする際には通常のRGB色空間で処理 するよりもHSLで処理したほうが便利なことがある(顔検出とか)。 ProcessingではcolorMode()を使うことでRGBやHSBを簡単に扱うことができるが、HSLの扱い方が見つからない。そこでRGB->HSLに変換するメソッドを自作してみた。

RGBとは

念のため、そもそもRGBとは何かを説明しておきたい。簡単に言えば、赤(Red)、緑(Green)、青(Blue)の混ざり具合のことで、この3原色を用いることでほぼどんな色でも表すことができる。中学の美術の教科書で色のついた円が3つ重なった画像を見かけたと思うがあれのことである。「加法混色」なので、混ざると白に近づき、真っ白は(255,255,255)で真っ黒は(0,0,0)である。 ProcessingではデフォルトでこのRGBにアルファ値(A)を加えたRGBAを扱うことができる。 アルファ値とは透過度のことである。pngなどの画像を読み込むときに、その画像のアルファ値を部分的に0にすることで背景を消したりすることができる。

HSBとは

こちらは、色相(Hue)、彩度(Saturation)、明度(Value・Lightness・Brightness)で表される色空間で、 僕はRGBで色をランダムに生成したときに汚い色ばかり出てきていやだな~と思ってドキュメントを読んだら見つけた。

明度がVだったりLだったりして、HSB,やHSLと呼ばれたりもする。つまり本質的には後述のHSLと同じなのだが、僕が期待するHSL空間が錐体型のモデルなのに対し、ProcessingのHSB空間はどうやら円柱型のようなのである。 そのため、この記事ではあえて明示的にHSBとHSLを分けて書いている。

HSLとは

上記の通り、HSBと同じである。ちなみに、Wikipediaで調べるとまとめてHSVに転送される。この辺の議論はネットで調べるといろんな情報が(色だけに)でてくるのであまり深く突っ込まないことにする。

RGB->HSLのメソッド

ここからが本題で、「Processingで扱われているRGBを錐体型のHSLに変換する」のが目的である。 以下がプログラムの全文である。

3つ値を返したかったのでPVectorを使ったが、もっといい方法があるかもしれない。入力はRGBで、Hは0~360, S,Bは0~100の値で返ってくる。入力がfloat型になってるのはrandomで数値を代入するときにいちいちint型に直すのが面倒だったからで、リアルタイム処理などで速度を気にする場合はintで動くようにしたほうがいいかもしれない。

たまっていたProcessingネタをちょっとずつ消化しているが、そろそろ他のことも書きたい。