指定色で減色+誤差拡散、減色結果を他のアプリと比較してみた
指定した色に減色する時に誤差拡散を使う
この前はメディアンカット法を使って選んだ色をパレットの色にして
その色を使って普通に減色していた
今回は誤差拡散も使って減色
いつもの画像を8色に減色
できた!…と思う
これだけだと正解なのかわかんないので
減色処理に誤差拡散を使えるアプリと比べてみる
画像ビューアのIrfanView
1色単位での減色もできるは今回知った
かなりきれいに減色できる、色の選び方が上手だと思う
COLGA
減色の設定がいろいろできるCOLGA
ディザリングの強さも指定できる
Maxの10だとノイズっぽくなる
こういう調整はどう処理しているのかなあ
ディザリングレベル5
だいぶ印象が変わる
Yukari
減色アプリのYukari
こちらは今回初めて使ってみた
COLGA同様ディザリングの強さを指定できるのでMaxの100
色の選び方が他のアプリとは違うみたいねえ
電信柱の黒がない
並べてみる
irfanViewとCOLGAは誤差拡散は自然な感じ
僕が作ったのはあんまり拡散していない感じなんだよねえ、境界線が見える
それにしてもアプリに依って色の選び方、誤差拡散も違うから
どれが正解ってのもないのかなあと思い始める
16色
色の選び方で違いが出るねえ
ピクセル数優先で色を選ぶと青空はきれいになるけど
トマトの花の色がイマイチになる
PixelFormatを変更して減色
WPFでは画像のPixelFormatを変更すると自動で減色と誤差拡散処理される
Indexed1だと2色
Indexed2は4色
Indexed4は16色
この時に選ばれる色(パレット)が特徴があって
元画像にはなさそうな色も選ばれる
今回のアプリでは表示画像の色を取得して表示するのも作ったので
それを使ってみると
この画像だと赤系の色はなさそうなのに2色も入っている
少なくともk平均法やメディアンカット法だけじゃないねえ
面白いのでこれを使って自分の処理で減色と誤差拡散してみる
誤差拡散なし
誤差拡散あり
PixelFormat変換の減色にかなり近いものになった
Indexed1で2色
PixelFormatをIndexed1にして2色にしたところ
このパレットで誤差拡散してみると
じっくり見比べなければわからない程度には同じになっている
これをもって今回のアプリの誤差拡散は
ほぼ正解ってことになりました!
2色減色を比較
今回の誤差拡散はかなり時間がかかった
最初は今までどおりのつもりで誤差拡散を書いたら
こうなってしまった
色が右下へ流れたような感じ
右ピクセルに誤差拡散する処理は
本当は
右下へ流れたような感じになったのは
右にずれる
右へずれてしまう処理
距離は変換前の色とパレットの全色の距離を比較、これがC欄で
赤文字が近い
この変換前の色っていうのが画像の元の色+誤差、これがA欄
色の距離は単純にRGBそれぞれの差の2乗を足したもの、これの平方根
処理の流れ
(200,255,200)から(170,200,120)へ変換したので誤差は(30,55,80)、B欄
この誤差を右ピクセルに足(拡散)して(230,310,280)、A欄
これで1ピクセルの減色と誤差拡散が完了
2ピクセル目の処理
誤差拡散された色(230,310,280)、これとパレットの色の距離を計算
それぞれ317,203なので色2のほうが近いので色2へ変換
(230,310,280)から(170,200,120)へ変換したので誤差は(60,110,160)、B欄
この誤差を右ピクセルに足(拡散)して(260,365,360)、A欄
これで2ピクセルの減色と誤差拡散が完了
こんな感じで進めていくと同じような色が並んでいると誤差がどんどん溜まっていって、いざ別の色が来た時にも溜まった誤差のせいで同じ色に変換されるのが続いてしまう、この状態が右へ色が流れたような感じになるみたい
そこで誤差がたまりすぎるのが良くないと思って、誤差拡散は1ピクセルの処理ごとにリセットしたのが
これでいいんじゃないかってくらい良くなったけど
なんか違う
今回の誤差拡散法は右と下方向x3の合計4方向に
拡散するFloydSteinberg式を使っているんだけど
この結果は右ピクセルだけにしか拡散していない感じ
右方向のこれだけ見るとあっているんだけどねえ
実際には下方向の拡散もあるから少し違う
次に思いついたのが誤差の蓄積に上限を付ける方法
実際にはマイナスにもなるので下限も付けて0以下は0、255以上は255にするようにした結果が、さっきから使っているこれ
上が0-255制限
下がパレットの各色各RGBからの制限
あんまり変わんないかな
16色に減色
注目はやっぱり赤いいちごがどうなるのか
画像全体では少ない赤のピクセルの扱いはどうなるのってところ
一番元画像に近いのはCOLGA、素晴らしい再現度
僕のアプリもなかなかだと思う(自画自賛2回め)
Vieasはノイズっぽいけど床の木目の再現度が高い
Yukariの誤差拡散は暗い色が連続していても明るい色がポツポツ出る
JTrimだけ色合いが違う、これは色はパレット色の選び方でピクセル数が多いCubeを優先しているのかなあ
アプリによるパレットの違い
元画像に使われている色は34335色
これを元にしたり、しなかったりで16色パレットを作るわけだけど
アプリに依ってぜんぜん違うねえ
気になるのはVieas、派手な(彩度の高い)赤とピンク、黄緑を選んでいる
誤差拡散を使えば中間の曖昧な色は他の色と組み合わせれば再現できるから
こういう極端な色を選ぶのはありなんだよねえ
処理速度
16色パレットを作るのに4秒
誤差拡散で減色するのに5秒で合計9秒もかかる!
他のアプリは
一瞬 Vieas
一瞬 JTrim
一瞬 PixelFormat.Indexed4
1秒 COLGA
2秒 IrfanView
5秒 Yukari
9秒 今回のアプリ
一瞬で終わるのはどうなっているのかなあ、すごい
Vieas
赤いノイズはクリックしてもとの大きさにすると
そんなに目立たないけどやっぱり気になる
って書いたんだけど投稿した記事を見たら全然目立たない
記事作成中と投稿した記事では見え方が違うんだなあ
色相90のHSVグラデーション画像を16色へ
Yukariは暗いところで明るい色が出てくるのが不自然だなあと思ったけど
これは設定で誤差拡散の強さをMaxの100にしているせいだった
初期値の80にしたら
不自然さがなくなってなめらからになった
これはきれいだなあ
COLGAとYukariの2つは減色の設定ができるので
今回の比較よりも良い結果になる設定もあると思う
これも0~255制限に変えたら少し良くなった
コードの一部、変換するとこだけ
指定したパレットの色に減色+誤差拡散、誤差蓄積は0-255制限
いままではPixelFormatPgbr32を使ってきたけわかりやすいRgb24にした
画像のほうが見やすい
元の画像の色情報の配列変数名がpixels
誤差蓄積は0以下や255以上は切り捨てて0~255までに制限は494行目
条件演算子?:は初めて使ってみた
使い方(書き方)はエクセルのIF関数そっくりで
(条件)?Trueのときの処理:falseのときの処理
今まで使い所がわからなかったけど
iPixels[pp] = (pGosa < 0) ? 0 : (pGosa > 255) ? 255 : pGosa;
↑の1行は↓の3行と同じ処理
if (pGosa < 0) { iPixels[pp] = 0; }
else if (pGosa > 255) { iPixels[pp] = 255; }
else { iPixels[pp] = pGosa; }
3行以上かかっていたのが1行で済むので楽ちん
見た目が分かりづらく感じるけど、これは慣れかな
参照したところ、素晴らしいアプリ
IrfanView - Official Homepage - One of the Most Popular Viewers Worldwide
http://www.irfanview.com/
「IrfanView」定番の画像ビューワー - 窓の杜ライブラリ
https://forest.watch.impress.co.jp/library/software/irfanview/
COLGAのページ
http://www14.plala.or.jp/lptrans/colga/colgatop.html
Yukari
結社「障泥烏賊ライブラリ」用地
http://aoriika.exout.net/
JTrim
WoodyBells
http://www.woodybells.com/
フリーソフト&壁紙ギャラリー - Vieas Web
http://www.vieas.com/
今回の記事で画像の減色処理の大まかなところは全部試したかなあ
あとは
色の距離の測り方
色の選び方の調整
処理時間の短縮
どれも難しそう
コード全部
アプリダウンロード先(ヤフーボックス)
関連記事
誤差拡散の続き、2018/03/27は18日後
パレットを使った減色で誤差拡散 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15432449.html
2018/03/06パレット作成は3日前
メディアンカット法で色の選択、減色してみた、難しい ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
2018/03/04パレット作成
k平均法で減色してみた、設定と結果と処理時間 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
2018/03/02
単純減色と誤差拡散とディザリング ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
27色+誤差拡散
2018/02/23
FloydSteinberg他いくつかの誤差拡散を試してみた、白黒2値をディザリング ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ