第07回 ランレングス符号

単純なハフマン符号の限界

前回見たように、シンボルが多数ある場合にハフマン符号を使うと、シンボルの出現率が偏っているほど平均符号長が短くなり、効率が良くなる。 しかし、シンボルが2種類だけの場合はハフマン符号を使っても効率は改善されない。

モノクロの画像は白と黒のどちらかのピクセルだけで構成されるので、白と黒のピクセルをシンボル W, B と考えれば、この32x32ピクセルの画像はこの2文字からなる「文」として扱うことができる。
「一番上の行を左から右に順に見て、次はその下の行をまた左から右に...」という読み方をすれば、これは長さ \(32\times32=1024\) の文になる。
図1
図1のような画像では白のピクセルが黒より多く、シンボル W が発生する確率は B が発生する確率よりも高い。
しかし、シンボルが2種類しかないので、ハフマン符号は結局
シンボル 符号語
W 0
B 1
となり、画像の情報を送るにはピクセル数と同じ1024ビットのデータが必要になってしまう。

ランレングス符号

概要

上のケースで「Bがいくつ続いたか」「Wがいくつ続いたか」に応じて、シンボルの並びに対して符号語を作ってみる。
符号語の先頭には「何が」、それに続くものとして「続いた数-1」を入れることにして、続いた数を1~8の範囲で許容することにすると、種類用に1ビット、カウント用に3ビット使って以下のような「シンボルの並びに対する等長符号」ができる。

表1
シンボル
の並び
意味 符号語
B Bが1個 0000
BB Bが2個 0001
BBB Bが3個 0010
BBBBBBBB Bが8個 0111
W Wが1個 1000
WW Wが2個 1001
WWW Wが3個 1010
WWWWWWWW Wが8個 1111
のような等長符号を作ることができる。 このような符号を固定長ランレングス符号という。
この符号を使えば、上の例の画像の上側82ピクセル分 は


Wが8個, Wが8個, Wが8個, Wが8個, Wが7個, Bが2個, Wが8個, Wが8個, Wが5個, Bが4個
→ 1111 1111 1111 1111 1110 0001 1111 1111 1100 0011
となり、40ビットのデータで送ることができる (白黒でなくても、色の数がそれほど多くない場合であれば符号語の先頭に割り当てるビット数を色数に応じて増やせば同様のことができる)。

この方法の効率は、BとWの単独の出現率ではなく、その切り替わりがどれほど頻繁に起こるかに依存する。
図1のようにBとWの変化があまり起こらない場合であればこの方法で効率は上がるが、
図2
のようなケースでは「Bが1個」「Wが1個」のように1つのピクセルあたり4ビットの符号語が割り当てられ、データ量は4倍に増えてしまう。
このときはシンボル「B」「W」に対して符号語の長さはいずれも4ビットなので、平均符号長も4ビットになる。

もう少しだけシンボルが連続する
図3
のようなケースでは「Bが2個」「Wが2個」の並びに対して4ビットの符号語が割り当てられる。このときのデータ量は、シンボルの並びに対しては4ビット、1つのシンボルに対しては2ビットとなる。
つまり、このときの平均符号長は2ビットになる。

課題1

以下に示す図4のような画像を表1の方法でランレングス符号にしたときの平均符号長を求めよ。
図4
「Bが4個」「Wが4個」の並びに対して4ビットの符号語が割り当てられる。

課題2

以下に示す図5のような画像を表1の方法でランレングス符号にしたときの平均符号長を求めよ。ただし、結果は四捨五入して小数第三位までにすること。
図5
「Bが5個」「Wが5個」の並びが全部で 1020/5=204組あり、それぞれに4ビットの符号語、最後の「BBBB」に対しても4ビットの符号語がわり当たる。
それらを加えたのが全データ量で、それをシンボルの数で割れば平均符号長が求められる。

ランレングス符号の平均符号長

概要

一般的な場合の固定長ランレングス符号の平均符号長は以下のようにして求める。
「B」「BB」「BBB」...「BBBBBBBB」の出現率を \(p_{b1}\)~\(p_{b8}\)、「W」「WW」「WWW」...「WWWWWWWW」の出現率を \(p_{w1}\)~\(p_{w8}\) とすると、シンボルの並びの平均の長さ (その並びにあるシンボルの個数の平均) \(L_s\) は

\( \begin{eqnarray} L_s&&=p_{b1}+2p_{b2}+\cdots+8p_{b8}+p_{w1}+2p_{w2}+\cdots+8p_{w8}\\ &&=\sum_i^8 \left(ip_{bi}+ip_{wi}\right) \end{eqnarray} \)

のように表わせる。

一方、どの並びに対する符号語も4ビットなので、「シンボルの並び」に対応する符号語の平均の長さ \(\bar{L}\) は、\(\bar{L}=4\) (ビット) となる。

よって、平均符号長、つまり「シンボル1つあたりに平均して割り当たる符号語の長さ」は以下のようになる。

\( \begin{eqnarray} L&&=\frac{\bar{L}}{L_s}=\frac{4}{\displaystyle{\sum_i^8} \left(ip_{bi}+ip_{wi}\right)} (ビット) \end{eqnarray} \)

課題3

表1の方法で \(p_{b1}=p_{w1}=0.43\) で、 \(p_{b2}\)~\(p_{b8}\) と \(p_{w2}\)~\(p_{w8}\) がすべて \(0.01\) のときの平均符号長 \(L\) を求めよ。

これは B と W が単独で出てくることが多い場合、つまり効率が悪いケースにあたる。

課題4

表1の方法で \(p_{b1}\)~\(p_{b7}\) と \(p_{w1}\)~\(p_{w7}\) がすべて\(0.01\)、\(p_{b8}=p_{w8}=0.43\) のときの平均符号長 \(L\) を求めよ。

これは B と W が8個連続で出てくることが多い場合、つまり効率が良いケースにあたる。
課題3と比べて小さい値になるはず。
inserted by FC2 system