データ圧縮
データの実質的な性質を保ったままデータのサイズを縮小することは、データ圧縮と呼ばれる。データ圧縮はデータ転送における転送時間の短縮や、データを記憶装置に残す場合の記憶容量の削減に有効である。
データ圧縮は大きく分けると可逆圧縮と非可逆圧縮がある。可逆圧縮では圧縮プロセスの際に情報が失われず、圧縮前の状態に戻すことが可能である。非可逆圧縮では不必要な情報を削除することでデータ量を減らすため、情報の一部が失われることがあり、圧縮前の状態に戻すことはできない。
一般的には可逆圧縮よりも非可逆圧縮の方が圧縮率が高い。画像や音声などの人間があまり認識できない成分を含んでいるデータでは、情報の欠如があまり問題にならないので、非可逆圧縮が使用されることが多い。
圧縮技法の代表的なものとして、ランレングス符号化、ハフマン符号化、辞書式符号化、差分符号化などがある。現在ではこれらの技法の組み合わせや拡張などによって高い圧縮率を得ている。
ランレングス符号化
圧縮されるデータの中に連続する記号がある場合に、その記号と、その記号が連続して出現する回数へと符号化する方法をランレングス符号化(Run Length Encoding)、または連長圧縮と呼ぶ。ランレングス符号化は可逆圧縮である。
例えば、「AAABBBBB」というデータがあった場合、Aが3回、Bが5回連続しているので、符号化すると「A3B5」などのように表現することができる。
圧縮されるデータをすべて符号化してしまうと、圧縮前よりデータ量が増えてしまうこともある。例えば「ABCD」のような連続した記号が無いデータの場合、圧縮すると「A1B1C1D1」となり、データ量は倍になってしまう。このような問題を避けるために通常は、「何回以上連続している場合に符号化する」という回数を指定する方法がとられる。
ハフマン符号化
頻度依存符号化の一種であるが、現在使用されている頻度依存符号化のほとんどがハフマン符号である。ハフマン符号化では、表現するデータのビットパターンの長さを、その出現頻度に反比例させる。つまり出現頻度が多いほど符号化されたデータのビットパターンの長さは短くなる。ハフマン符号化は可逆圧縮である。
文章のハフマン符号化の例を考えると、まずデータに存在している記号の出現頻度を調べ、出現頻度が一番多い記号に 0 を、二番目に多い記号に 10、三番目に多い記号に 110 ・・・などのようにビットパターンを対応させていく。文章の場合Unicodeなどの固定長のデータが使用されるが、符号化されたデータは可変長のデータとなる。
符号化するプロセスは、ハフマン木と呼ばれる木構造を考えると視覚化され理解しやすい。ハフマン木については「データ圧縮の基礎『ハフマン符号化』の仕組みを見てみよう」に分かりやすい例が掲載されている。
上記のように、データを読み込んですべての記号の出現頻度を調べてから符号化していく方法は静的ハフマン符号と呼ばれる。これに対し、記号をひとつ読みこむ毎に出現回数を追加して符号化し直す方法を適応型ハフマン符号、または動的ハフマン符号と呼ぶ。
ハフマン符号化が使用されている代表的なアルゴリズムとしてDeflate(デフレート)がある。Deflateではハフマン符号化とLZSSというアルゴリズムを組み合わせた可逆圧縮アルゴリズムであり、ZIPなどで採用されている。
辞書式符号化
各データブロックを辞書への参照として符号化する方法を辞書式符号化と呼ぶ。ここでの辞書とは、圧縮されるデータのブロックの集合である。通常は可逆圧縮となるが、画像データの場合は厳密には非可逆圧縮となることもある。
文章の辞書式符号化を例に考えると、文章の文字は通常、文字コードに対応するビットパターンで表現されている。1つの単語を1つのブロックとして、単語の文字数が3文字だとしても、Unicodeであれば6バイト必要になるが、符号化すると短い文章であれば数ビットに圧縮できる。
辞書式符号化の代表的なものとして、LZW符号化がある。LZW符号化では、基本ブロックを含む辞書によって符号化されるが、データ中により大きな単位のブロックが見つかるとそれを辞書に追加していく。こうすることで複数の参照ではなく1つの参照で、より大きなデータ単位を表現することができる。
例えば、「AB AB AB」というデータの場合、1番目にA、2番目にB、3番目にスペースが辞書に登録されており、最初の「AB 」は123と符号化される。その後に同じパターンのデータが見つかるので、「AB」を1つのパターンとして4番目に追加する。すべてを符号化すると、123434となる。
差分符号化
動画などの連続する画像データの場合、大量の画像データを個別に符号化するより、直前の画像データとの変化を記録して符号化する方が高い圧縮率を得ることができる。このような方法を差分符号化、またはデルタ符号化と呼ぶ。差分符号化は、可逆圧縮と非可逆圧縮のどちらでも実装でき、ほとんどの動画圧縮で採用されている。
画像の圧縮
ビットマップ形式の画像データは、データ量が非常に大きなものとなってしまうため、様々な技法を用いて圧縮が行われる。代表的な画像ファイルフォーマットとして、GIF、PNG、JPEGなどがある。
GIF(ジフ:Graphic Interchange Format)
ピクセルあたり256色に制限している可逆圧縮のファイルフォーマットである。圧縮にはLZW符号化が用いられるため、使用される色が少ない画像に適している。透明やアニメーションなども表現できる。
PNG(ピング、ピン:Portable Network Graphics)
ピクセルあたり最大48ビットのRGBを表現することができる可逆圧縮のファイルフォーマットである。GIFの特許の問題や、256色以上を表現する目的で開発されており、圧縮にはDeflateを採用している。
GIFと比べても圧縮率が高いことが多く、GIFの代替として普及している。アニメーション機能はサポートしていないが、別のフォーマットとしてアニメーションを実現している。
JPEG(ジェイペグ:Joint Photographic Experts Group)
ISOの標準体系でもあり、デジタルカメラなどのカラー写真の圧縮で広く使用されている。圧縮には可逆圧縮と非可逆圧縮のどちらも存在しているが、高い圧縮率と完成度を実現している非可逆圧縮が一般的である。
JPEGの圧縮ではまず、画像を8×8ピクセルのブロックに分割して、各ブロック単位で離散コサイン変換という数学技法が適用される。この圧縮では、人間が認識できないような画像データの圧縮が行われるため、見た目には変化がないことが多い。その後、ランレングス符号化やハフマン符号化などの圧縮技法が用いられ、さらなる圧縮が行われる。
音声の圧縮
デジタル化されたアナログ音声データは、複雑で規則性を見出すことが困難であるため、上記で紹介したような汎用的な圧縮技法は適していない。音声圧縮の多くは、人間が知覚できない、または知覚しにくいような音を削除して行われる。
従来では圧縮率の高い非可逆圧縮が一般的であったが、近年では記憶装置の大容量化や通信速度の高速化などにより、音声関係のエンジニアやオーディオマニアなどの間では、音質の劣化が少ない可逆圧縮が好まれている。
音声ファイルフォーマットで最も有名なものとしてMP3(MPEG-1 Audio Layer-3)がある。動画圧縮規格であるMPEGのオーディオ規格として開発されている。
動画の圧縮
動画圧縮で最も広く採用されている標準規格としてMPEG(エムペグ:Moving Picture Experts Group)がある。主なものとして、標準テレビ放送やHDTVなどで利用されているMPEG-2がある。