2012年4月13日金曜日

ビット平面


ちょっと解説。専門家ではありませんので正確性は話半分ということで。

bitplane、ビットプレーンともいう。

OpenGL にかかわらず情報処理技術全般で使われる言葉。"bitaplane" で検索するよりも「ビットプレーン」で検索したほうがわかりやすい例が出ました。
検索結果1(wikipedia)検索結果2検索結果3

ある画像ファイルを考えてみます。画像ファイルというのはピクセル(画素)と呼ばれる点が集まったものです。300個のピクセルが200列に並べば300x200のサイズの画像になります。

ここではある画像ファイルがあり、ピクセルのそれぞれについて
  1. そこが輝いているかどうか
  2. そこが赤いかどうか
  3. マウスクリックに反応するかどうか
という情報を持っているとします。

それぞれの情報が true か false というのは1か0という値で表現できます。例えば輝きがあって(=1)、赤くて(=1)、クリックに反応しない(=0)ピクセルが持つ情報は[110]となります。他にも例示してみると以下の様になります。
輝かない白でクリック反応:001
輝かない赤でクリック反応:011
輝く青でクリックは無反応:100

今、幅3px高さ2pxの小さな絵があったとします。その情報は以下のようになっているとしましょう。
[111][001][110]
[011][001][010]

この時「赤かどうか」ということだけに注目し2つめの情報だけをピックアップして並べてみると
[1][0][1]
[1][0][1]
となります。1つ1つのピクセルの情報が1とゼロだけで表現されました。

ある1つの要素(ビット)に注目して取り出した時に、1とゼロの2次元配列(幅x高さ)で表すことができます。この2次元配列がビット平面、ということになります。

ピクセルごとの情報は必ずしも2進数で表現されている必要はありません。例として3x2の画像で2つの情報(例えば明度と彩度とか)が以下のように記録されていたとします。
[2, 10][5, 11][6, 12]
[3, 10][2, 12][2, 12]

10進数は2進数に変換することができます。ただし桁数が決まっていないといろいろ不都合なので、ここでは4桁として変換すると
[0010, 1010][0101, 1011][0110, 1110]
[0011, 1010][0010, 1110][0010, 1110]
(であってるかな?)

それぞれのピクセルのデータはカンマで2分割されていますが、これはくっつけてしまいましょう。
[00101010][01011011][01101110]
[00111010][00101110][00101110]

こうすると(x, y)=(2,1)の情報は "00101110" だ、というふうに1つの数値で表現することができます。

ここまで来ればビット平面の抽出は同じ。それぞれのピクセルの情報について右から3桁目だけを抽出して並べると、
[0][0][1]
[0][1][1]
となります。他の桁でも同じ事ですね。

0 件のコメント:

コメントを投稿