しらぎくモバイルシステムに搭載されている画像変換機能で白黒画像の生成に欠かせない減色処理について解説します。
画像に用いられている色を減らすには、どのようにしたら良いでしょうか。
ここでは、話しを単純にするため、0〜255まで256段階のグレイスケールを白黒化する事を考えてみましょう。
最も単純な方式は、ある値を基準に白と黒にきっちり分けてしまうと言う方法でしょう。
例えば中間値である127以上なら白、127未満なら黒と単純に分けてしまうのです。
しかし、この方法だと例えば0と64が並んでいるような箇所でも、どちらも黒と言う事になってしまいます。
つまり、ベタで塗り潰されたようになってしまうと言う事です。
新聞や雑誌などの白黒ページでは、中間色をアミで表現しております。
この方法はちょっと離れて見ればグレイスケールのように見えるという点では優れているのですが、解像度の低い場合には網目が粗くなって何の画像化が分かり難くなってしまいます。
実際、携帯電話の画像は白黒専用機の場合、せいぜい幅120ピクセルズくらいしかありません。
120ピクセルズしかない状況でハーフトーンをやろうとしたら、画像が粗くなりすぎてしまうのではないのでしょうか。
結局、ウェブで用いる画像には向いていないと言えるのです。
量子化やハーフトーンの弱点を克服したのが誤差拡散法です。
誤差拡散法は、各ピクセルの値と減色された際のピクセル値との誤差を、周りのピクセルに拡散させる事で、差の影響を引き出そうと言うものです。
実際には誤差拡散法の他にも、オーダドディザ, ランダムディザなどが考案されておりますが、ここでは多くの画像処理ソフトが採用している誤差拡散法を用いる事にしました。
誤差の配分はいろいろ言われておりますが、最も効果的で且つ簡単なのは、以下のような方法です。
それぞれ与えると言うものです。
この様にして誤差を拡散していく事で、単純な量子化で白黒を分けても問題は無くなりました。
周りのピクセルが誤差の影響で白黒が入れ替わり得るからです。
今までは、話しを単純にするために、グレイスケールを白黒化するという条件で解説しました。
しかしながら、実際にしらぎくモバイルシステムで扱う画像はカラー画像です。
カラー画像を白黒化する場合、ちょっと注意しておきたい事があります。
それは光の三原色である赤・緑・青はそれぞれ明るさが異なると言う事です。
具体的には緑は非常にまぶしい色ですが、赤は緑に較べるとかなり暗い色です。青に至っては黒よりちょっと明るいと言う程度でしかありません。
この様に三原色で明るさが異なるため、単純にパレットの値で白黒化するとおかしな結果になってしまいます。
そこで、パレットコードから色の明るさへ変換して、その明るさに対して誤差拡散法を適用するようにします。
実際、RGBパレット値から輝度を得る公式は以下のようになることが知られております。
但し、実際のスクリプトではある理由から敢えて上記とは異なる比率にしております。
誤差拡散法により、白黒二階調に変換しても適度にアミが掛かるなどして見易い画像になります。
しかし、馬鹿正直に誤差拡散法を利用しようとすると、例えば人物画像の肌色の箇所に点がまばらに描かれたりして、醜い仕上がりになってしまいます。
そこで、上述の輝度変換の公式, 誤差拡散法での誤差配分, 及び誤差拡散後の量子化の基準点などを調整する事で、肌色などの薄い色では白無地になるように調整を施しております。
余り大きな画像データを処理させると、サーヴァに過剰な負荷を与える恐れがあるため、携帯電話で利用され得る大きさを超えていると思われる大きさのデータは門前払いにしております。
しらぎくモバイルシステムでは、白黒への減色だけでなく、フルカラーの画像を216色に減色する機能も用意しております。
カラーへの減色ではRGB毎に誤差拡散を施す事になります。