色々な色空間でカラーサークルを作ってみた

この記事は [グラフィックス全般 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/graphics) 9日目の記事です。

どうも。個人で[Electron＆Webなお絵かきアプリ](https://warotarokz.sakura.ne.jp/illustmate/))を作っていたりいなかったりする者です。もう８年くらいやってます。

# 背景 ～ カラーピッカーを充実させたい

今年の3月の話になりますが、それまで自作のお絵描きアプリではカラーピッカーがHSL一本のみという男らしい状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/d6e66222-d028-5b67-dc4c-1a1ce0b2d083.png)
従来のカラーピッカー

しかし、そろそろ一般的によくある円形のピッカーも用意したいなぁ…ということで、HSL以外の色空間について調べてみることにしたというのが今回の背景です。

# 方針

- 円形のカラーピッカーに向いているものを探す（必然的に色相環が作れるものに限る）
- 黄色→青のような難しい色変化を追いやすいものが欲しい
- できるだけカラーバンドの無いものがよい

二つ目の方針について補足すると、たとえば下の画像のようなカラーピッカーでは黄色から青に行こうと直線で移動すると、途中で緑になったり水色になったりします。隣り合わない色相の色遷移は途中で必ず灰色を経由する必要があります。それをやりやすいカラーピッカーが欲しいということです。（説明が難しい…）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/cc3e316d-cb87-6b06-fc65-579c5efc1d14.png)


三つ目の方針については、下の画像を見ると明らかに他より明るく見える色（黄色、水色、紫）が3方向に見えると思いますが、こういった部分をここではカラーバンドと呼ぶことにします。こういう部分が少ないものがよい、ということです。あっても使えないわけじゃないんですが、ない方が印象が良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/947567bd-b7e5-82cb-8174-d781e2cb22fc.png)

# color-space でカラーサークルを作ってみた

[color-space](https://www.npmjs.com/package/color-space)を使用すると、簡単に色空間からRGB値を取り出すことができます。
今回はこのライブラリを使って色々な色空間のカラーサークル（カラーホイール）を作ってみました。

各サンプル画像の左側は角度を色相とし、彩度を固定、明度を中心から外へ0→100%と変化させたものです。右側は明度を固定して彩度を中心から外へ0→100%と変化させたものです。

## HS系

| カラーサークル| 感想 |
|:-:|:-:|
|HSV<br/>![HSV](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/c13eeb33-d8d8-e17b-864b-a1d385ea18ba.png)|Hue、Saturation、Valueで色が決まる。王道。ほとんどのペイントソフトでこれは入っている。<br/>直感的に分かりやすい。しかしカラーバンドがはっきり見える。|
|HSL ![HSL](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/9d2decaa-4020-6108-585e-fa630fc36188.png)|こちらも非常に一般的に使われる色空間。左のはHSVの二つをくっつけたような形になっている。<br/>ペイントソフトでは四角形で使われていることが多いように思う。円形にすると中心に黒が集まりすぎて、いまいち使いづらそうになる。|

## HC系

| カラーサークル| 感想 |
|:-:|:-:|
|HCG<br/>![HCG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/88ba470b-bd29-a3b6-8cc4-a64c58acffe0.png)|Hue、Chroma、Value で色が決まる色空間。[ライブラリからのリンク](https://github.com/scrapjs/hcv-color)によると、かつてHCGという名前だったが、医学用語との衝突を避けるためHCVに改名されたらしい。しかし今度はC型肝炎ウィルス(HCV)と被っていたりする。<br/>HSVと非常によく似ているが、中心に黒が集まっているので明るい色が選びやすそう。|
|HCY ![HCY](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/1d2d9fd2-6871-7a9e-abdc-7926f31e7b15.png)|Hue、Chroma、Luminance で色が決まる…らしいが、だったらなぜ Y なのか？調べてもよく分からなかった。Yが輝度信号を意味する色空間があるので、それと関係があるのかもしれない。<br/>ミスミソウの葉のような不思議な形が見える。綺麗だが、カラーピッカーとしては使いづらそう。|

## LAB

| カラーサークル| 感想 |
|:-:|:-:|
|LCHab（右は明度70固定）<br/>![LCHab](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/fa29c6aa-d13c-12be-56da-3ad43e0f961c.png)|L、a、bで色が決まる色空間。Lは明度で、aは赤緑、bは黄青の度合い。円形にするにはabをxy座標と考えて計算する。<br/>人間の知覚に近くなるように考案されたものらしい。右のサンプルを見ると、明度に偏りが少なく、明度が固定できているように見える。でもちょっと青が明るく見える気もする。<br/>カラーバンドについては、左のサンプルはなんとも言いがたい形が見えて面白い。中にAIが入ってそう。右はぼんやりとしたカラーバンドが見える。<br/>本来は人間の知覚の研究に向いているらしい。また、LABにはLAB(CIELAB)とLABhunterの二種類があり、今回はCIELABの方の極座標版(LCHab)を使用した。|

## UV系

| カラーサークル| 感想 |
|:-:|:-:|
|LCHuv（右は明度70固定）<br/>![LCHuv](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/9a0ff08e-da57-11e6-2075-6ff68fab645a.png)|L、u、vで色が決まる色空間。Lは明度で、uは赤緑、vは黄青の度合い。Labと似ているが何やら[歴史的背景](https://ja.wikipedia.org/wiki/CIE_Luv%E8%89%B2%E7%A9%BA%E9%96%93)があるらしい。<br/>カラーバンドについては、右はLabより偏りが少なく、使いやすそうである。|
|YUV ![YUV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/06d62f59-6337-d079-c185-5af6c7a4eefb.png)|UV系はなぜかたくさんあるので、色々試してみた。YUVはテレビの映像伝送のための色モデルらしい。<br/>色鮮やかなのが良い。右のは黄色の範囲が狭そうなのと縦横にバンドが見えるのが惜しい。|
|HSLuv ![HSLuv](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/ad95a28a-d11e-5afb-1209-c755e5305e2c.png)|だんだん混乱してきたが、[ライブラリのソースコード](https://github.com/colorjs/color-space/blob/master/hsluv.js)を見ると[本家HP](http://www.hsluv.org/)へのリンクがある。かなりしっかりしたHPが用意してあって、それを見るとCIELUVを彩度を扱いやすく拡張したものらしい。たしかにLCHuvとよく似ているし、値のとり方も同じだった。<br/>ただ、右のをよーく見るとうっすらHSLに似たカラーバンドが見える。伊達にHSLを名乗っていないなという感じがする。|
|HPLuv<br/>![HPLuv](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/f0c00e8a-4d76-364b-cf81-727e227d14e5.png)<br/>![HPLuv2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/d80ee54e-e832-6e88-f655-3fb182697423.png)|[ライブラリのソースコード](https://github.com/colorjs/color-space/blob/master/hpluv.js)を見るとHSLuvと関係があるのかもしれない。カラーバンドもあまり見えず、改良版という感じもする。ただ、極端に色が淡い。<br/>右はこれで彩度がマックスまで行っているはずなのだがどうにも淡いので、ダメ元で明度を200%にしてみたのが下のもの。鮮やかさは増したが、HSLuvと似た感じのバンドが出てしまった。|

# 自作してみた（色空間ではない）

色々見てみましたが、全体としてバランスがよいのはLCHuvかなぁと思いました。しかし、結局使いやすいのはHSVという感じもしました。そこでアイデア。HSVを単にガウスぼかししただけです。おお、なんか綺麗じゃないですか。ということで、実際に自作のアプリに採用しました。
画像処理してしまいましたし、これは色空間ではないわけですが、本来の目的はカラーピッカーを作りたいということでしたから、そもそも色空間である必要はなかったんですね！（本末転倒

![ブラーHSV](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/b773b4c9-a389-da82-3a4a-f7c460ab7621.png)

まだまだアドベントカレンダーは続きます。引き続きよろしくお願いいたします！