色の距離は難しい、いくつか試したけどわからなかった
色の距離
減色処理で指定したパレットの色に変換する時
パレットの中から一番近い色を探す必要がある
パレットがこの3色の時
この色はどの色に近いのか
僕の目から見ると が一番近い
こういう処理
今まではこの処理をRGBの値からユークリッド距離で行っていたけど
色によってはいまいちな結果になることがある
パレットがこの2色のとき
RGB(160,129,66)
RGB(20,206,49)
RGB(115,195,61)この色に近いのは
僕の目から見ると なんだけどRGBだと だと判断される
RGBでのユークリッド距離はRGBそれぞれの差の2乗したものを合計したもの
(R1-R2)^2+(G1-G2)^2+(B1-B2)^2
正確な距離を知りたいわけじゃなくてどっちが近いか知りたいだけだから
今回は平方根は必要ない
基準色 と色1 との距離
(115-160)^2+(195-129)^2+(61-66)^2=6406
基準色 と色2 との距離
(115-20)^2+(195-206)^2+(61-49)^2=9290
√6406=80.0
√9290=96.4
こんな感じでRGBでの計算だとたまにイマイチなことがあったのでRGB以外でも計算してみようと作ったのがこのアプリ
ダウンロード先
ランダムな20色を基準色に近い順に並べる処理をいろいろな計算で行う
距離の計算方法は上から
rgb 今まで使っていたRGBでのユークリッド距離
rgb2 RGBそれぞれに重み付けした、よくわかっていない
HSV円錐Ad ↑の円錐モデル
HSV円錐Ad ↑の円錐モデル
HSV円錐Tri ↑の円錐モデル
XYZ XYZ色空間でのユークリッド距離、よくわかっていない
Lab Lab色空間でのユークリッド距離、よくわかっていない
色相 HSVの色相
彩度 HSVの彩度
明度 HSVの明度
このなかでXYZとLabはほとんど理解できていないので僕の計算方法が間違っている可能性がとても高いので目安にもならないかも
HSVの色相、彩度、明度はああ、こうなるんだなあっていう参考用
本命はHSVの円柱、円錐関係
このアプリで遊んだ結果
色の距離は難しい、余計にわからなくなった
その過程
基準色はそのままでランダム色を変更してみる
重要なのは基準色に一番近い色をパレット(ランダム色)から選ぶことなので
左端の色が基準色に近いかどうか
今回はどの計算方法でも良い結果
これは意見が別れた
明度を見るとピンクは3番目、他の赤系と比べて高いのがわかる
ってことは円錐モデルは明度同士の距離を重視できるってことかなあ
このパレットから赤に近いのを選ぶのは迷う
RGBの判断は暗めの赤
HSV系はピンクが多い、2番目には黄色が入っているのは明度が近いからだねえ
ここまでだとRGBのユークリッド距離で十分な結果
今度は基準色も変えてみる
基準色を明るい青系の灰色、彩度が12.98と低いものに変えてみた結果
RGBは残念な結果になっている、これは違うなあ
対してHSV系はいい結果
パレットだけ変更
かなり意見が別れたけど、どれも納得できるかなあ
HSV系はどれも大差ないかなあと思っていたら
円錐モデルのユークリッド距離の結果がいまいち
明度が低い色
明度が低い青紫が基準色
他のHSVはイマイチかな、色相の近い紫を選んでいる、特に円錐Adは違う
再度と明度ともに低い色の場合
他のHSVは良好かな、でもこのパターンは難しいな
パレット変更
RGBはぜんぜん違う緑色を選んだ
基準色の明度が極端に低くて黒に近い色なら、色相を無視して明度が低い色を近い色とする、とか
基準色の彩度が極端に低くて色相がわからないときも、色相を無視して彩度と明度を重視する、とか
そんな味付け(重み付け)みたいな事すれば良さそうなんだけど、コレガワカラナイ
以下は距離の計算部分のコード
動作確認しているところ
参照したところ
色の距離(色差)の計算方法 - Qiitaうーん、難しい、今回試した方法以外にもまだある
https://qiita.com/shinido/items/2904fa1e9a6c78650b93
CIE XYZ表色系(9): XYZ-RGB の変換式 と カラートライアングル
http://www.enjoy.ne.jp/~k-ichikawa/CIEXYZ_RGB.html
JavaScriptでRGBからLab色空間への変換 - QiitaRGBをXYZ、Labに変換するコードはこちらからパク…参考にしました
https://qiita.com/hachisukansw/items/09caabe6bec46a2a0858
カラーコード変換ツール | Hex、RGB、HSV、CMYK、XYZ、LAB、HSLに対応XYZ、Labの変換が正しくできたかどうかの判断はこちらを参考にしました
https://syncer.jp/color-converter
HSVやHSLからRGBへの変換 ( プログラム ) - Color Model:色をプログラムするブログ - Yahoo!ブログ円錐モデルのHSVとRGBの相互変換はPSPさんのBlogを参考にしました
https://blogs.yahoo.co.jp/pspevolution7/17680244.html
プログラミング 第6弾 ( プログラム ) - Color Model:色をプログラムするブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/pspevolution7/17682985.html
ありがとうごさいます!
色のソートにSortedListを使っていて、距離をKey、色をValueにして追加している
違う色どうしでも稀に同じ距離になることがあって、SortedListはKeyの重複を許さないのでここでエラーになる
ダウンロード先(ヤフーボックス)
関連記事
2018/2/20は3週間前
WPF、Color(RGB)とHSVを相互変換するdll作ってみた、オブジェクトブラウザ使ってみた ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15380324.html