- RGB ビット深度のうんちく (前編) 〜 前提知識
- RGB ビット深度のうんちく (中編) 〜 実数型と整数型の変換
- RGB ビット深度のうんちく (後編) 〜 整数型同士の変換
はじめに
このエントリは、不連続なRGB値の相互変換についてのうんちくです。
デジタル画像同士のビット深度変換の話になります。概念的には中編の延長でもあるので、そちらを先に読んでもらえると助かります。
デジタル同士のビット深度変換
要領は中編で解説したアナログ(or実数)<=>デジタル変換の図とほぼ同じです。
ただし、真ん中の均等化が使われる可能性が結構ありそう。という違いはあります。
4ビット<=>8ビット
画像サイズの節約だと、例えばテクスチャ画像などで4ビットがよく使われます。
グレースケール | カラフル |
---|---|
2^4 = 16色 | 16^3 = 4,096色 |
なお、以下が最低限のルールです。
- 最小輝度はどちらも 0x0 だという事
- 最大輝度の4ビット表現が 0xF、8ビット表現が 0xFF でこの2つは同じ明るさという事。
- 4ビットの 0x0〜0xF を均等に引き伸ばせば 8ビットの 0x0〜0xFF になる事
4ビット => 8ビット
0xF を 0xFF にすれば良いので、基本的には 0x11 を掛け算するだけです。
8ビット => 4ビット (最近傍)
なお、整数のままでも計算できます。
(x*0xF + 0x87) >> 8
8ビット => 4ビット (均等化)
最近傍方式に比べて、量子化誤差が暴れる可能性が上がりますが、ビットを落とすだけの方が処理が速いメリットを考えれば、選択肢できるケースはあります。
8ビット => 4ビット (逆数)
4ビット => 8ビットで 0x11 かけるだけなので、0x11 で割れば良いよね。という短絡的な処理です。ビットを落とす均等化方式はまだメリットとのバランスが取れますが、これは悪手です。
とはいえ、そういう処理系もありそうですので、把握はしておくべきです。
8ビット<=>16ビット
最近、輝度ダイナミックレンジを広げる為に 16ビットを使う機会が増えてきました。あと、画像処理エンジンは下位ビットに誤差を積もってもある程度耐えられるよう、内部的に16ビットで画像を処理したりします。
グレースケール | カラフル |
---|---|
2^16 = 65,536色 | 65,536^3 = 28,147,497,6710,656色(約281兆色) |
最低限のルールは、4ビット<=>8ビットとビット数が違うだけで同じです。
- 最小輝度はどちらも 0x0 だという事
- 最大輝度の8ビット表現が 0xFFFF、16ビット表現が 0xFFFF でこの2つは同じ明るさという事。
- 8ビットの 0x00〜0xFF を均等に引き伸ばせば 16ビットの 0x0000〜0xFFFF になる事
8ビット => 16ビット
0xFF を 0FFFF にするので、0x101 を掛け算するだけです。
16ビット => 8ビット
4ビット<=>8ビットで既に3種類紹介したので、最近傍法だけ図にします。
整数演算はこちらです。
(x * 0xFF + 0x807F) >> 16
参考URL
- Fast and Accurate Color Depth Conversion
最後に
間違いあれば修正しますので、ご指摘下さい。