asumism

あすみん(@an_asumin)のブログやで

LED用のカラーピッカー作ったぽよ

概要

まだまだLEDを光らせている私です.フルカラーのLEDだといろんな色を出せて最高なので,全然飽きません.でも,RGBの出力をシークバーで「えいやー!」って決める感じだと,実際にどんな色が出るかは直感的に分からないので,よくないなぁと思い始めました.最悪な感じがします.ってことで,もっといい感じに色を設定できるようにカラーピッカーを作ってることにしました.

成果物


解決した問題点

直感的なカラーピッカーといえばHSV色空間を用いたものだと思う.ヒトとしてはまず色相を決めたい感じがするからね.光源色を設定するためにHSV色空間を用いてよいかは,ここでは深く議論しない*1けど,ディスプレイ上の色をLEDに反映させるにはいくつかの問題点がある.

表現可能な色の範囲が異なる

ディスプレイにはカラーモデルがある.つまり,いくつかの予め決められた原色を足しあわせることで多様な色を表現する.そして,その原色の波長が異なると,表現可能な色も違ってくる.現行のディスプレイはsRGB/D65のカラーモデルを採用しているのが多い.以下のサイトでsRGBのカラーモデルと今回用いるLEDのカラーモデルを比較してみた.
CIE XYZ表色系(10): XYZ / RGB 変換マトリックスの計算

ちなみに,LEDの三原色の波長の色度座標は以下の本の巻末の付表を用いて求めた.(ヒトの色の知覚に関する大まかな知識を得たり各表色系を理解するのによい本だと思う.)

色彩工学入門―定量的な色の理解と活用

色彩工学入門―定量的な色の理解と活用


f:id:an_asumin:20131216004948p:plain
[sRGBが表現可能な色]

ヒトが視れる色の内,sRGBのディスプレイでは上記の三角形の内側だけしか表現できないことになる.よって,少なくとも色域(三角形)の外側の色については正確ではない.


f:id:an_asumin:20131216004929p:plain
[LEDが表現可能な色(ただしホワイトポイントはD65のまま)]

比較すると緑と赤の原色の色度座標がかなり異なっていることが分かる.緑色周辺の色弁別閾値は他の領域に比べて大きいとはいえ,ディスプレイのRGBの数値をそのままLEDの各原色の発光強度に当てはめてもよい結果にならないだろう.

解決法

特定の色をHSV表色系からRGB表色系に変換した後,一旦XYZ表色系の三刺激値に変換する.その後,LEDの色空間に変換する.各変換は一次変換であり,マトリクスは事前に求めておくことができる.XYZ表色系はスペクトル軌跡の外側の値を原刺激値として採択している*2ので,表色系を変換するのに都合が良い.Yが輝度を表現し,XとZは輝度に関与しないという現実の色にはない便利な側面も持つ.


LEDの原色光度が異なる

LEDの各原色の定格での光度はそれぞれ異なる.今回用いるLEDでは原色によって最大1.93倍の光度の差がある.つまり,設定する色(原色の組み合わせ比)によって設定可能な最大光度が変わってくる.

解決法

GUIを動的に変化させることで解決した.具体的には,色相が変化した際に,彩度と明度が構成する三角形の領域の大きさを適切に変化させることで,設定可能な相対的な光度を示すようにした.LEDの実装によって各チャンネルの最大光度は異なるが,その比が分かっていれば簡単な計算で処理することができる.動画を見るとよくわかると思う.

雑感

プログラミングに関することだけど,ViewとかListenerとか独自に作ったのは初めてだった.というか,いつのまにやらAndroidではFragmentと呼ばれるものを中心にプログラミングするようになっててビビった.

面白いほど楽に色を設定できるようになったので,ますますLED光らせるのが好きになったのだけれど,LED側からするとあんまり嬉しくないことがいくつかあったので最後に書いておく.

LEDのホワイトポイントよくわからんちん

色度計とかもってないのでよくわからんちん.でも,ホワイトポイント自体,何を白とするかを決めるための色度なので,私が白だと思えばそこが白になるのだろう!

LEDで表現可能な全ての色を表現できるわけではない

LEDは緑色の波長とその光度の高さに特徴があるが,ディスプレイ側の緑色周辺の色域が広くないので,そもそも設定不可能になってしまう領域があったようだ.

LEDの色の深度を活かしきれてないかも

ハードウェアの実装では,LEDのRGBは12bit,4096階調で設定できるようになっている.それに対して,ディスプレイのRGBはそれぞれ8bit,256階調である.計算の過程で,複数回の一次変換とガンマ変換がかかるので,設定先の解像度が高いことは有利ではあるものの,階調の深さが活かしきれていない感じがしなくもない.



これからも楽しくLチカするのです!
おつかれさまでしたッ )^o^(

*1:HSV色空間のVはValue,つまり明度であり,物体の反射率を指すことが多いが,光の明るさと同様の知覚内容とされているので,特に問題はないと考える.- http://ja.wikipedia.org/wiki/明度#.E8.89.B2.E3.81.AE.E4.B8.89.E5.B1.9E.E6.80.A7

*2:虚色といって,スペクトル軌跡に収まらないために具体的に表現できない色のこと