第5講 データ圧縮  1講 2講 3講 4講  6講 7講 8講 9講 10講 11講 12講 13講 14講

コンピュータの基礎第5講
データ圧縮

【第5講のポイント】 本講では、画像・音声・動画等のデジタルデータでよく用いられる圧縮技術について学ぶ。さらに、データに冗長性を持たせることによって、エラーの検出・訂正を可能にする符号化法についても学ぶ。

【第5講の目標】学習後、以下のことが身についたかチェックしよう。
  1. 非可逆圧縮と可逆圧縮の意味を理解する
  2. 代表的な可逆圧縮法のアイディアを理解する
  3. 誤り検出符号、誤り訂正符号の仕組みを理解する

【第5講の構成】
  1. 可逆圧縮と非可逆圧縮
  2. 非可逆圧縮
  3. 可逆圧縮のアイディア
  4. 誤り検出・訂正符号

第1節 可逆圧縮と非可逆圧縮

 データ圧縮とは、(デジタル)データが表す情報に対するより短い表現を工夫し、元のデータと実質同じ情報を表しながらよりサイズの小さなデータ(符号)に変換することを言う。この時、圧縮データ(符号)からもとのデータを完全に復元できる圧縮を可逆圧縮という。
 画像や音声データ等の圧縮では、人間にはわからない程度の情報省略を行ってサイズを縮める手法がとられることが多い。このような圧縮はもとのデータを完全には復元できないので非可逆圧縮と呼ばれる。
 以下の節では、主に可逆圧縮で利用される基本的なアイディアを解説する。実際の圧縮ではこれらを組み合わせた高度な手法が使われる。

非圧縮 可逆圧縮 非可逆圧縮
テキスト等 ZIP,LZH
音声 WAV TAK MP3
画像 BMP PNG JPEG
動画 AVI MPEG
 音声・画像・動画の主な圧縮・非圧縮ファイルの形式(拡張子)には右表のようなものがある。

.ファイル(フォルダ)のZIP圧縮は次の手順で作成・解凍(展開)できる。
  • Windows:ファイルを右クリック⇒送る⇒圧縮(ZIP形式)フォルダ
         ZIPファイルを右クリック⇒すべて展開
  • Mac:ファイルをControlキーを押したままクリック⇒圧縮
       ZIPファイルをダブルクリック(展開)
*問5.1.以下のファイル圧縮実験を行い、結果を報告せよ。 (ヒント)
  1. メモ帳(テキストエディタ)を使い、適当なテキストファイルを作成して保存せよ
  2. WORDを使い、1.と同じ内容の文書ファイルを作成して保存せよ
  3. ペイントを使い、適当な画像ファイルを(作成して)、
    1. ファイルの種類を24ビットビットマップ(BMP)にして保存せよ
    2. ファイルの種類をJPEG(JPG)(非可逆圧縮)にして保存せよ
  4. 1.で保存したテキストファイルを右クリックしてプロパティを選び、ファイルサイズを調べよ。さらにテキストの文字数とファイルサイズの関係を調べよ。
  5. 2.で保存した文書ファイルのファイルサイズを調べよ
  6. 3.aで保存したBMPファイルを右クリックしてプロパティを選び、ファイルサイズ画像のサイズ(縦・横のピクセル数)の関係を調べよ。
  7. 3.bで保存したJPEGファイルのファイルサイズを調べよ
  8. 1, 2, 3 で作成したファイルを圧縮(lzhまたはzipの可逆圧縮)し、 圧縮率=圧縮後サイズ/圧縮前サイズ を求めよ。
解答欄
ファイル圧縮前サイズ圧縮後サイズ圧縮率
テキスト
WORD文書
画像(BMP)
画像(JPEG)
・テキストの文字数とファイルサイズの関係:
・BMPファイルのピクセル数とファイルサイズの関係:
コラム.可逆⇔不可逆・非可逆
  1. 可逆とは、元(逆)に戻れることを言い、そのような変化(過程)を可逆変化(過程)と言う。通常、可逆の反対語は不可逆で、元に戻れない変化(過程)を不可逆変化(過程)という。一方、圧縮の場合は可逆圧縮⇔非可逆圧縮というのが普通である。

非可逆圧縮の実験

 非可逆圧縮には、様々な手法があるが、いずれも、人間の耳や目では認識できないほど細かな変化に関する情報をカットして圧縮を図るものである。単純な例えで言えば、標本値の個数を1/2にするか、量子化のレベル数を1/2乗にすれば、データ量は半分になる。
 実際、音声波形は様々な周波数の波を重ねて得られるが、このうち細かな変化を表す高周波数成分をカットしても、人間の耳には違いが感じられない。画像においても同様に、色調の大きな変化(低周波数成分)や細かな変化(高周波数成分)をわけて抽出することができ、人間にはその変化を感じられないような高周波数成分をカットすることによって、圧縮につなげることができる。
 また、このように(離散)データを周波数成分に分けることを(離散)フーリエ変換という。

実験.画像の非可逆圧縮(JPEG)
  1. 紅月燐火氏によるフリーのグラフィックコンバータ「BTJ32」をダウンロードし、jpeg変換の圧縮率と画質の関係を確認せよ

第2節 可逆圧縮のアイディア

 本節では、可逆圧縮の様々なアイディアを紹介する。実際の圧縮アルゴリズム(プログラム)はこれらのアイディアを組み合わせて圧縮している。  

差分符号化

音声(音波)のデジタルデータや動画における一連の画像列では、標本化の時間間隔が非常に短いので、ある時刻のデータが直前のデータとほとんど変わらないことが多い。そのような場合各時刻で、データ全体ではなく、直前のデータからの変化(差分)を保持すると圧縮になる。また画像差分データはほとんど0(変化なし)なので、次に説明するラン・レングス法が有効に働く。

例1.+:1増、o:無変化、-:1減、とすれば、
  012345433221 ⇒ 0+++++--o-o-
  0123255433 ⇒ 0+++-5o--o (2以上変化したら再スタート)
問5.2.上記の例1で (ヒント)
  1. 123323445 を差分符号化せよ
  2. 5-+-+o-o+ を復号せよ
  3. 12335654 を差分符号化せよ

例2.画像A,Bの差分画像Cはビット毎のxor(排他的論理和)
  で得られ、 で元に戻る。
但し □=0、■=1 とおけば、
 □xor□=■xor■=□、□xor■=□xor■=■ である。
画像A画像B差分画像C
問5.3.上のアプリを使って (ヒント)
  1. AとBの差分画像C=A xor Bを求めよ
  2. 画像Bと差分画像Cの1(■)の個数を比較せよ
  3. B=A xor C であることを確かめよ

ラン・レングス法

 同じ0,1列(パターン)が一定回数以上繰り返される場合、繰り返し全体をその列と繰り返し回数で置き換えることによって、圧縮を図る。
例.文字(バイトパターン)と連続回数で表現
  • aaaccbbb ⇒ a3c2b3
  • 00100110が100回続くとき、8ビット×100=800ビットの0,1列が、00100110 の8ビットと回数100を表す8ビットの16ビットですむ。特に画像などで背景に同じ色が続くときに有効である。

 特にFax(0:白点、1:黒点)データでは、データが0から始まると約束すれば 0, 1 の連続回数だけで表現できる。
例.000111100000111113455   1100000111111000 ⇒ 02563
  01111111111000 ⇒ 19013(回数は1文字の数0~9と仮定し、10回を901と表す)

*問5.4.0,1列に対する上記(Fax)の符号化で (ヒント)
  1. 00111000を符号化せよ
  2. 11000111を符号化せよ
  3. 123を復号せよ
  4. 0123を復号せよ
  5. 1203を復号せよ

LZ符号

 文字列(バイトパターン)の繰返しを、直前の出現位置(が何文字前か)と文字列の長さの対で表現する。
 例えば、改行や空白も1文字とする文字列
小さい秋見つけた⏎誰かさんが□誰かさんが□誰かさんが□見つけた⏎小さい秋□小さい秋□小さい秋□見つけた
をこの方法で圧縮すると
小さい秋見つけた⏎誰かさんが□(6,12)(23,5)(32,4)□(5,10)(20,4)
となる。
 実際、最後の(20,4)はその20文字前から始まる4文字の見つけたを、中央の(23,5)はその23文字前から始まる5文字の見つけた⏎を表す。誰かさんが□の後の(6,12)は少し複雑だが、誰かさんが□誰かさんが□になることに注意しよう。
 次の問の2.からもわかるように、LZ法はランレングス法の拡張になっている。

*問5.5.LZ符号について以下の問に答えよ (ヒント)
  1. "Pitter Patter↵Pitter Patter" を符号化せよ
  2. "aaaaa" を符号化せよ
  3. "Ban(2,3)" を復号せよ

ハフマン符号

 モールス信号はツー(-)とトン(・)という長短2種類の信号の組み合わせで文字を表し、無線通信に利用する。英語では英文における文字の出現割合を調べ、よく出現する文字ほど短く表す工夫をして文章を送信する際の効率を上げている。(因みに日本語ではおおよそabc順にイロハを割り当てたのでカナ文字の出現割合には対応していない)

問5.6.モールス符号 (ヒント)
日本語および英語のモールス信号における各文字の符号を調べ、どのように定められたか、説明せよ。

 モールス信号と同様の考え方で、データ中の文字(あるいは8ビット列)の出現確率(頻度)の高いものほど短い符号を割り振るものにハフマン符号がある。これにより平均的な符号の長さが短くなり圧縮される。

例題.テキスト(文字列) araarazaka をハフマン符号化してみよう。各文字の出現頻度はそれぞれ a=6, k=1, r=2, z=1 であり、それらに空符号を仮に割り当てておく。次に出現頻度の低い2文字 k, z の符号に0,1を追加し(前に付け)、これらを合わせて kz=2 とする。次に、{ a=6, r=2, kz=2 } のうち出現頻度の低い r と kz の符号に 0, 1 を追加し、これらを合わせて, rkz=4 とする。この段階で出現頻度は{ a=6, rkz=4 }、各文字の符号は a:, k:10, r:0, z:11 である。最後に rkz と a をまとめて{ rkza=10 }と符号 a:1, k:010, r:00, z:011 を得る。

 この結果、元のテキスト araarazaka は 1001100101110101 という長さ 16 のビット列で符号化される。これは、1 文字 8 ビットのASCII符号に比べれば 16/80=20% に圧縮されており、4文字しか出現しないことに着目してそれらを等しく2ビットで符号化する定長符号に比べても16/20=80%の圧縮になっている。
 文字列 araarazaka に限らず、文字 a, r, k, z の出現確率がそれぞれ 0.6, 0.2, 0.1, 0.1 であるときのハフマン符号の平均符号長は 0.6×1+0.2×2+0.1×3+0.1×3=1.6 であり、理論上最小の平均符号長を意味する平均情報量は 0.6×(-log20.6)+0.2×(-log20.2)+0.1×(-log20.1)+0.1×(-log20.1)≒1.57 である。

 ところで、ハフマン符号列 1001100101110101 から元の文字列を復号するにはどうすればよいだろうか。実は頭(左)から順に当てはまる(一致する)文字に置き換えてゆけば
 1001100101110101 ⇒ a001100101110101 ⇒ ar1100101110101 ⇒ …
のように復号できる(試してみよ。このような符号を接頭符号という)。
 実際ハフマン符号を構成する際は、出現確率の低い文字(集合)をまとめては符号ビットを頭(左に)付けることを繰り返しているので、ハフマン符号列を頭から読んでゆくと、その構成過程を逆にたどって元の文字に到達できる。

*問5.7.ハフマン符号 (ヒント)
  1. 例題中のハフマン符号で、符号 0101011001 を復号せよ。
  2. 文字列 abrakatabra を前頁のアプリでハフマン符号化せよ
  3. 2.のハフマン符号で、11001110100 を復号せよ

第3節 誤り検出・訂正符号

 圧縮はどのようなデータに対しても可能なわけではない。可能なら、すべてのデータはそのサイズを限りなく小さくできるが、それはあり得ない。実際、可逆圧縮可能ということは、元データに冗長性や規則性があって、よりコンパクトな表現が可能なことを意味するし、非可逆圧縮では、圧縮すればするほど、元のデータとはかけ離れたものになる。
 一方、普段我々が使う表現(文章、話し言葉、画像など)は冗長性に満ちており、たとえ一部が欠落したとしても受け手が補うことで問題なく情報が伝達されることが多い。
 ここでは、データを、冗長な符号で表現することによって、転送(計算)時の誤りを検出・訂正できる符号化について解説する。

チェック・ディジット

 受験番号や学籍番号などで、末尾にチェック・ディジットと呼ばれる英数字1文字がついていることがある。この1文字は本来の番号からある計算規則によって定められる。番号の入力ミスや(計算規則を知らない)第三者による悪用の場合、対応する(番号+チェック・デジット)が存在しないことが多く、これをを防ぐ目的がある。運転免許証や銀行の口座番号などでは、チェック・ディジットが分からないように数字で埋め込まれている(という)。

パリティ・ビット

 0,1の列の最後に0または1を1桁付け加えて、列中の1の個数が常に偶数(奇数でも同じ)にするためのビットをパリティ・ビットという。言い方を変えれば、パリティ・ビットを付け加えることによって、どの符号(0,1列)を比較しても2か所以上異なっているようにする。
 こうしておくと、1文字だけ誤って通信されたときは、1の個数の偶奇が異なる(正規の符号から1か所だけ異なる)ため、対応する符号が存在せず、誤りがあったことが検出できる。これを1誤り検出符号という。(2個以上の偶数個数の誤りは検出できないが、その確率は低い。)
 例えば、半角英数字を表す8ビットASCII符号は、実質7ビットなので頭の1ビットをパリティ・ビットに利用することがある。

問5.8.1の出現数を偶数にする偶数パリティについて、以下の問に答えよ。 (ヒント)
  1. 11010101, 01100110, 00000000 の内、誤りが含まれるのはどれか。
  2. 次の7ビットデータの後ろに、偶数パリティビットを付け加えよ
    (1) 0111010、(2) 1100100, (3) 1111111
s

ハミング符号

情報ビット追加ビット
X1 X2 X3 X4 Y1 Y2 Y3
0 0 0 00 0 0
0 0 0 11 1 1
0 0 1 01 1 0
0 0 1 10 0 1
0 1 0 01 0 1
0 1 0 10 1 0
0 1 1 00 1 1
0 1 1 11 0 0
1 0 0 00 1 1
1 0 0 11 0 0
1 0 1 01 0 1
1 0 1 10 1 0
1 1 0 01 1 0
1 1 0 10 0 1
1 1 1 00 0 0
1 1 1 11 1 1
 (7,4)ハミング符号と呼ばれる右表をみてみよう。左4ビットが本来の情報を符号化したビットで右3ビットは誤りを検出・訂正するための追加ビットである。詳しい作り方は省略するが、Y1、Y2、Y3 はそれぞれ、X2X3X4、X1X3X4、X1X2X4 に対する偶数パリティビットになっている。(しょうがくせい向けハミング符号の仕組み
 (7,4)ハミング符号の異なる符号は、必ず3か所以上異なっているので、2か所以内の誤りであれば誤りがあったことが検出でき、1か所の誤りであれば(最も近い符号を特定できるので)それを訂正できる。
 一般に、すべての符号が互いにn箇所以上異なっているとき、(n-1)箇所の以内の誤りまで検出でき、 n/2 (小数点以下切り捨て)箇所以内の誤りを訂正できる。

*問5.9.(7,4)ハミング符号(右上表)について以下の問に答えよ。 (ヒント)
  1. すべて互いに3か所以上異なることを確認せよ
  2. ビット列 0100111 は正しくはどの符号だと考えられるか、即ち一番近い符号はどれか。
  3. ビット列 0100110 は正しくはどの符号だと考えられるか、即ち一番近い符号はどれか。
  4. 一般に、すべての符号が互いに n 箇所以上異なっているとき、n-1 箇所の以内の誤りまで検出でき、(n-1)/2 箇所以内の誤りを訂正できる理由を述べよ