「ランダムな色」の色空間は RGB?HSL?CIELAB?

乱択 3 バイトを RGB と HSL の2通りで解釈してみたり.

ランダムな色って何だろう?
僕のブログのサムネイル (OGP?アイキャッチ?) は,たいてい自作のスクリプトで自動生成させてる (作りたいときは専用に作ることもある).スクリプトは GitHub で公開しているけど,最近このスクリプトの動作に注文付けたい気持ちになってきた.色が偏ってる気がするんだよね.

上の画像は2022年2月24日現在でのブログのトップページ (PC 版表示) の全スクロール分のスクショ.長いので2回改行 (?) して3列にしてるけど,重要なのは左2列ののブログ記事たちのアイキャッチ画像の色味.何となく緑味に寄り過ぎてるような気がしない?緑とドピンクと紫ばっかりな感じ.これをなんとか解消したい.
乱数をそのまま RGB としても「ランダムな色」にならない?
この色はランダムな3バイトの入力を RGB として解釈して色にしてる (僕の実装が間違ってなければ…).Linux の /dev/urandom
が吐き出す乱数を16進表示に直して,最初の2桁を R の,次の2桁を G の,次の 2桁を B の値として使ってランダムな色を構成してる (この記事にロジックの説明を書いた).具体的にはこう:
# get 4 byte random numbers in base 16
random=`od -An -N4 -tx < /dev/urandom`
color=`echo $random | cut -c 1-6`
この実装の課題 (?) はいくつかある.例えば無彩色が選ばれる確率はかなり少ない.無彩色が出るためには R = G = B
である必要があるけど,その確率は 1 * 1/28 * 1/28 = 1/216 ~ 1.5e-05 と極めて低確率.これは「厳密に無彩色」が出る確率だけど,やや緩和して「”ほぼ” 無彩色」が出る確率を (多めに) 見積もっても,1 * 13/256 * 13/256 ~ 2.6e-03と,依然として 1% 未満だ.

ここで「”ほぼ” 無彩色」は,RGB 3つの値がどれもビット深度 (216) の 5% 以内 (差が13未満) に収まる,と定義.
知覚的にランダムな色を得るには HSL か?
現状のスクリプトではランダムな3バイトを RGB と解釈して色にしたけど,ランダムな 3バイトを HSL 入力と解釈して,それを RGB に変換してから色としてもいいはず.HSL から RGB への変換式はこのサイトを参考にした.実験してみた結果が下の画像.

乱択 HSL 色のほうが白や黒のような明度の極端な色を得やすいという傾向がわかる.乱択 RGB で明度の極端な色を得ようと思ったら RGB の全てが小さい値か大きい値に揃ってないといけないもんね.
でもこれが僕が欲しかった「ランダムな色」かと問われると…?少なくとも上記の画像の実験では乱択 RGB 色のほうがカラフルで多数の色が登場してるように見えるような…🤔 この記事は色について詳しく書いていて面白いんだけど,この記事のオススメは HSV で,HSL ではないようだ.HSL だと L = 100% で白だけど,HSV では S = 0% (彩度 0) かつ V = 100% で白となるという違いがある.
CIELAB 色空間を理解したい
直上でも言及したブログはさらに進んで議論してる.HSV もオススメだけど,もっといい選択肢があると.
多くの場合「HSBは便利!」で話が終わるのですが、問題はここからです。しばらく使っていると、実はいろいろ不満も出てくるのです。
* 同じ明度でも色相によって実際の明るさが違う
* 均等色空間ではないので色の変化にばらつきがある上記の欠点を克服することを意図された色空間はいくつかあります。そのうちの一つがCIELABです。
プログラムで綺麗な配色を作る方法(CIELAB色空間の巻) – FAL 制作メモ
Wikipedia の Lab 色空間の記事も充実していて読めば色々分かりそう.これも読んでスクリプトに反映しようかなあ.スクリプトに不満があるけど,直すのはまだ少し先になりそう…
1件のコメント