2006 年 2 月 6 日 22 時 18 分

表現ビット数の削減による減色


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真] [写真] [写真]


今日は、減色処理を行ってみる。

最近は画像を扱う機器の性能が向上しているため、
パソコンはおろか、携帯電話ですら、
高品質の画像を表示することができる。

しかし、高品質の画像というのはその分情報量が多いため、
データのサイズは大きくなる。
減色処理というのは、画像に使用する色の数を限定し、
1 ピクセルを表現するのに必要なビット数を減らす方法である。
もちろん、表現ビット数が減るため、画質は多少劣化するが、
方法によっては、それなりに精度を保つことができる。

減色の方法(考え方)は 2 種類ある。
1 つは、RGB の表現ビット数を減らす方法。
ピクセルあたり 16 ビットの BMP はこの方法を取っている。
もう 1 つは、カラーテーブルを使う方法。
ピクセルあたり 8 ビット以下の BMP はこちらだ。

表現ビット数を減らす方法は計算が速くて良いが、
ビット数が少なくなると、色を表現できる範囲が
極端に少なくなり、色の粒度が荒くなる問題がある。
例えば、全体的に明るめの画像を表現する場合、
表現ビット数が少ないと、微妙な明るさの違いが表現できない。

では後者のカラーテーブルを使う方法はどうか。
カラーテーブルに色を自由に選べるので、
画像に合わせたカラーテーブルを作れば、
ビット数が少なくなってもそれなりの画質を保つことができる。
難しいのは、どうやってカラーテーブルの色を選ぶかだ。


今日は、表現ビット数を減らす方法を試してみよう。
例えば、8 ビットを 5 ビットに減らす場合で考えてみる。

素早く計算するなら、3 ビット右にシフトすればいい。
以下の計算の場合、計算が速い上に、
計算前と計算後の範囲の対応が 1 対 1 となる。
(ちょうど 8 ずつの区間に分かれて対応付けられる)

$new = $old >> 3;

ピクセル値を、0 を最低出力、255 を最高出力とした
区間内の色の出力レベルとして考えた場合は、
以下の計算をすればよい。賛否両論あるだろうが、
俺はこちらの方が良いと考えている。

$new = int($old * 31 / 255 + 0.5);

写真は、RGB 各 4 ビットと RGB 各 2 ビットに減色したものだ。
(JPEG なので、厳密には違うが、感じは分かると思う)



Copyright (c) 1994-2007 Project Loafer. All rights reserved.