Cubeから色の選び方、メディアンカットで減色パレット
2週間前の続き
ダウンロード先

Pan1から6が選び方の違いで
Pan1 Cubeにあるピクセルの平均色
Pan2 CubeのRGBそれぞれの中央値(メディアン)
Pan3 Cubeの中心の色
Pan4 RGB空間の中心から見てCubeの中で一番遠い色
Pan5 Cubeの8隅の中でRGB空間の中心から見て一番遠い隅
Pan6 Cubeの中心から一番遠い色
CubeはRGB3要素(3軸)の直方体でエクセルだとうまくグラフにできないので
RBの2要素(2軸)の平面の長方形(rect)で
r | b |
215 | 250 |
124 | 226 |
76 | 190 |
155 | 247 |
123 | 52 |
73 | 193 |
129 | 248 |
104 | 231 |
29 | 24 |

こういうピクセル9個の色があったとして
ここから4色に減色してみる
色の位置を
グラフにすると

色の目安を重ねると

長方形の大きさは255x255

長方形の余分なところを削る
RBのそれぞれの最小値と最大値の長方形にする
Rの最小値は29、最大値は215
Bの最小値は24、最大値は250

水色枠が余分なところを削った長方形
これを分割する
分割する辺の選択
長い方の辺(軸)を分割する
Rの辺の長さは186
Bの辺の長さは226
なのでBを選択
辺の中心で分割する
B辺は24から250なので中心位置は
(250-24)/2+24=137
なので137の位置で分割すると

グループaとbに分割
この時点で長方形が2つになったので2色パレットならここで分割終了になる
3色以上ならここから更に分割するので
どちらの長方形を分割するかの選択になる
今回は最大辺長を持つ方を優先分割する
グループaの最大辺長はR辺の94
グループbの最大辺長はR辺の142
なのでグループbを分割する
分割する辺の選択は長いほうなので
そのままR辺になる
分割場所は辺の中央なので
(215-73)/2+73=144

グループbのR辺の144で分割して
グループbとc
これで3つまで分割できた、同じようにあと1回
最大辺長をもつグループaをR辺の中心76で分割して
4分割までできた
ここから4色を選ぶ
1.平均色

b,cの平均色を求める
RBそれぞれの平均を組み合わせた色を平均色としてみた
なので元になったピクセルにはない色になる場合もある
グループbの平均色は101,217になったけど
元のピクセルにはない色
この方法はすべてのピクセルとの計算だけど
全部足して1回割るだけだからそんなに時間はかからないかな
以前の記事では、すべてこの方法で選んでいた
2.中央値(メディアン)で選ぶ

グループbの場合
RBそれぞれを並べ替えて中央の位置にあるもの
RB(104,226)が中央値になる
もし要素数が偶数の場合は中央2つの平均値
例えば10,20,30,40,50,100という要素数6なら
30と40が中央の2つなので
(30+40)/2
=35
中央値って平均値とはまた別なんだよねえ
同じだと思ってた
そんな感じであんまりわかっていないけど
並べ替えが意外に重たい処理
それでも平均色よりは軽そう
3.RBの中心(127.5,127.5)から遠い色を選ぶ


(127.5-129)^2+(127.5-248)^2=14522.5
これの平方根が√14522.5=120.50934
この方法はすべてのピクセルの色との計算をするから
色の選び方の中では一番時間がかかる
遠い色を選んだのは
そのほうが極端な色(鮮やかな色)になって面白そうだと思ったから
中心に近い色だと灰色に近くなるし
平均色とも近くなるかなあと
でも近いのも試してみればよかった
4.長方形の4隅の中で一番RBの中心から遠い隅

中心からのユークリッド距離
一番遠かった隅2だと
(127.5-73)^2+(127.5-248)^2=17490.5
これの平方根は√17490.5=132.21565

この選び方はさっきのより極端な色になるはず
この方法は4点との計算だからラク
5.長方形の中心から一番遠い色

この方法もすべてのピクセルとの計算だから時間がかかる
一番遠かったのは右上の7番(129,248)
6.長方形の中心
これは一回の計算で済むからラク
以上の6通りの方法での減色パレットを

この画像から4色
RGBなのでCube(直方体)で計算して


p2の中央値パレットは平均色とほぼ同じ色になった
p3は灰色っぽいくすんだ、中心って感じのパレット
p4とp6は全く同じ色になった、鮮やかな色
p5は予想通りの極端な色、白と黒は見たままの色だけど
青は39,66,253、赤も真っ赤じゃなくて255,0,14だった
こういう極端な色はディザリングや誤差拡散を使うと良くなると思う

こういう極端な色はディザリングや誤差拡散を使うと良くなると思う
16色パレット


4色のときは同じだったp4とp6はかなり違う色になった
p1,2は安定している感じ
そしてp5の極端さ
256色

どのパレットも同じ色が並んでいるように見える
けど

それでも1枚1枚出されたら見分けつかないなあ
256色も使えばもっときれいになるかと思ったけど
どれも青空のグラデーションの縞模様が出ているねえ
花の部分は元画像と区別つかないくらい、きれいに減色できている
分割するCubeの選択方法を最大ピクセルに変更すると
縞模様が軽減される

さっきまでは分割するCubeの選択方法は最大辺長を持つCubeだった
これを最大ピクセル数を持つCubeに変更してパレットを作ると
ピクセル数の多い青空にパレットが割り振られて
縞模様が出にくくなる
同じ256色でもぜんぜん違う
8色


別の画像で4色

遠いほど鮮やかな色になる、p5,4,6は誤差拡散が楽しみ
16色

4色

p1,2の安定とp4,5,6の不安定さ
普通に減色したいだけならp1の平均色がいいね
16色

p3珍しく派手になっている
p4,5,6はおかしいw色の距離がなあ
32色

32色まで増やすと緑系もたくさん配置されて

グラデーション画像
4色


p4とp5も全く同じ色(0,0,255)(255,0,255)(0,0,0)(255,0,0)の4色で
どちらも期待どおり!
16色


4色と同じくp1とp2,p3、p4とp5が同じ色のパレットになった
256色


グラデーション画像はp6が他とは違うねえ
中央が誤差拡散したみたいになっている
色相90のHSVグラデーション画像
4色


p4は3色に見えるけど4色使っているらしい
16色

256色

感想
Pan1 Cubeにあるピクセルの平均色
Pan2 CubeのRGBそれぞれの中央値(メディアン)
Pan3 Cubeの中心の色
Pan4 RGB空間の中心から見てCubeの中で一番遠い色
Pan5 Cubeの8隅の中でRGB空間の中心から見て一番遠い隅
Pan6 Cubeの中心から一番遠い色
p1,2は似た傾向で最も良い結果、元の画像に近い
p3は地味め
p4,5も似た傾向でどちらも派手で極端なパレットになる
p6は4,5を少し抑えた感じ
どれか一つを選ぶとすればp1かp2で迷ってp1
もう一つ選べるならp5!誤差拡散時に期待
処理の重たさは測っていないけど書いた感じは
4=6>1≒2>>5>3
かな5,3は一瞬で終わるはず、4と6はピクセル数に比例するので画像のサイズが大きいほど時間がかかる、1と2もそうだけどもう少し軽いはず
256色とか色数が多くなると差がなくなる、面白いのは4~32色くらいかな
コードの一部
参照したところ
C# で高階関数的な、関数ポインタみたいな(Func でメソッドを切り替える) - 学び、そして考える関数を引数として渡す、引数として関数を渡す方法、Func
http://d.hatena.ne.jp/p-nix/20090226/p1
今回初めて使ってみた、便利!
減色の処理で使う中央値や分散、偏差は統計っていうジャンル?らしい、習った憶えないんだよなあ、さすがの記憶力!と思っていたら
なんでも今度から文系学校の数学からベクトルが消えて、代わりに統計になるとかで、つまり今までは統計を教えていなかったみたいで、ああ、やっぱり習ってなかったんだって少し安心したw普通科ってのは文系だったんだなあ、たしかに時間割で理系は少なかった。
ベクトルは担当の先生が面白い方だったから楽しかったけど、今まで使う場面が殆どなかったからなあ
統計に切り替えるのはパソコン(計算機)との相性が良いからだろうねえ、手書きで計算してもめんどくさいだけだけどパソコン使えば楽ちんは楽しい。
コード全部
アプリダウンロード
関連記事
2018/03/22、今回の記事の続き
分割するCubeの選択、メディアンカットで減色パレット ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15425150.html

2018/3/6は2週間前
メディアンカット法で色の選択、減色してみた、難しい ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15400162.html

関連記事
2019/03/01は1年後
画像で使われている色を3D散布図で表示してみた、Pythonとmatplotlibすごい ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15887088.html
