LoginSignup
10
11

More than 5 years have passed since last update.

RGB ビット深度のうんちく (後編) 〜 整数型同士の変換

Last updated at Posted at 2018-10-12

はじめに

このエントリは、不連続なRGB値の相互変換についてのうんちくです。
デジタル画像同士のビット深度変換の話になります。概念的には中編の延長でもあるので、そちらを先に読んでもらえると助かります。

デジタル同士のビット深度変換

要領は中編で解説したアナログ(or実数)<=>デジタル変換の図とほぼ同じです。
image.png
ただし、真ん中の均等化が使われる可能性が結構ありそう。という違いはあります。

4ビット<=>8ビット

画像サイズの節約だと、例えばテクスチャ画像などで4ビットがよく使われます。

グレースケール カラフル
2^4 = 16色 16^3 = 4,096色
image.png image.png

なお、以下が最低限のルールです。

  • 最小輝度はどちらも 0x0 だという事
  • 最大輝度の4ビット表現が 0xF、8ビット表現が 0xFF でこの2つは同じ明るさという事。
  • 4ビットの 0x0〜0xF を均等に引き伸ばせば 8ビットの 0x0〜0xFF になる事

4ビット => 8ビット

0xF を 0xFF にすれば良いので、基本的には 0x11 を掛け算するだけです。
image.png

8ビット => 4ビット (最近傍)

基本はコレです。
image.png

なお、整数のままでも計算できます。

(x*0xF + 0x87) >> 8

8ビット => 4ビット (均等化)

最近傍方式に比べて、量子化誤差が暴れる可能性が上がりますが、ビットを落とすだけの方が処理が速いメリットを考えれば、選択肢できるケースはあります。
image.png

8ビット => 4ビット (逆数)

4ビット => 8ビットで 0x11 かけるだけなので、0x11 で割れば良いよね。という短絡的な処理です。ビットを落とす均等化方式はまだメリットとのバランスが取れますが、これは悪手です。
image.png

とはいえ、そういう処理系もありそうですので、把握はしておくべきです。

8ビット<=>16ビット

最近、輝度ダイナミックレンジを広げる為に 16ビットを使う機会が増えてきました。あと、画像処理エンジンは下位ビットに誤差を積もってもある程度耐えられるよう、内部的に16ビットで画像を処理したりします。

グレースケール カラフル
2^16 = 65,536色 65,536^3 = 28,147,497,6710,656色(約281兆色)
image.png image.png

最低限のルールは、4ビット<=>8ビットとビット数が違うだけで同じです。

  • 最小輝度はどちらも 0x0 だという事
  • 最大輝度の8ビット表現が 0xFFFF、16ビット表現が 0xFFFF でこの2つは同じ明るさという事。
  • 8ビットの 0x00〜0xFF を均等に引き伸ばせば 16ビットの 0x0000〜0xFFFF になる事

8ビット => 16ビット

0xFF を 0FFFF にするので、0x101 を掛け算するだけです。
image.png

16ビット => 8ビット

4ビット<=>8ビットで既に3種類紹介したので、最近傍法だけ図にします。
image.png

整数演算はこちらです。

(x * 0xFF + 0x807F) >> 16

参考URL

最後に

間違いあれば修正しますので、ご指摘下さい。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11