「圧縮」とは
圧縮とは、データの内容をできるだけ保ちながら、データ量を小さくすることです。
画像、音声、動画、文書、プログラムなどのデータは、そのまま保存すると大きな容量を必要とすることがあります。データを圧縮すれば、保存に必要な容量を減らしたり、ネットワークで送信するときの通信量を減らしたりできます。
圧縮されたデータを利用できる状態に戻すことを展開または伸張といいます。
圧縮方式は、大きく
の二つに分けられます。
可逆圧縮
可逆圧縮は、圧縮したデータを展開したときに、圧縮前とまったく同じデータを復元できる圧縮方式です。
例えば、
- 文書
- プログラムのソースコード
- 実行ファイル
- 表計算データ
- 研究データ
などでは、一文字や一つの数値が変化しただけでも内容が変わってしまうことがあります。そのため、このようなデータには元のデータを完全に復元できる可逆圧縮が適しています。
例えば、次の文字列を考えます。
AAAAABB
Aが5個、Bが2個連続しているので、
A5B2
のように表せば、同じ文字を何度も記録する必要がなくなります。
このように、同じ値が連続する部分を
値 + 連続する個数
で表す方法をランレングス圧縮(Run-Length Encoding:RLE)といいます。
同じ値が長く続くデータでは高い圧縮効果が得られますが、
ABCDEFG
のように値がほとんど繰り返されないデータでは圧縮効果は小さくなります。
したがって、同じ圧縮方式でも、圧縮するデータの性質によって圧縮後のデータ量は異なります。
出現頻度を利用した圧縮
可逆圧縮では、同じ値の繰返しだけでなく、記号の出現頻度の偏りを利用することもできます。
例えば、A、B、Cの出現確率が
A:0.6
B:0.3
C:0.1
であるとします。
出現頻度の高いAには短い符号、頻度の低い記号には長い符号を割り当て、
A → 0
B → 10
C → 11
とします。
それぞれの符号長は、
A:1ビット
B:2ビット
C:2ビット
です。
1記号当たりの平均符号長は、
0.6×1+0.3×2+0.1×2
=0.6+0.6+0.2
=1.4ビット
となります。
このように、よく現れる記号に短い符号を割り当てることで、平均的なデータ量を小さくできることがあります。
ハフマン符号などは、この考え方を利用した代表的な可逆圧縮方式です。
非可逆圧縮
非可逆圧縮は、データの一部を取り除くなどしてデータ量を減らす方式です。
一度取り除いた情報は元には戻らないため、展開しても
圧縮前のデータと完全に同じデータにはなりません。
主に、
などで利用されます。
人間の視覚や聴覚には、変化に気付きやすい情報と気付きにくい情報があります。非可逆圧縮では、このような人が知覚しにくい情報を減らしたり、細かな値を近い値にまとめたりすることで、大きくデータ量を減らすことができます。
代表例として、
などがあります。
例えばJPEGでは、写真の細かな情報を近似することでデータ量を減らします。そのため、圧縮率を高めすぎると、細部が失われたり、ブロック状の乱れなどが目立ったりすることがあります。
可逆圧縮と非可逆圧縮の使い分け
可逆圧縮と非可逆圧縮のどちらを使うかは、元のデータを完全に復元する必要があるかによって判断するとよいでしょう。
| データ | 適した圧縮 | 理由 |
| プログラム | 可逆圧縮 | 一文字でも変化すると動作が変わる可能性がある |
| 文書 | 可逆圧縮 | 文字や数値を失えない |
| 研究データ | 可逆圧縮 | 元の値を正確に保存する必要がある |
| 写真 | 非可逆圧縮を利用できる | 多少の画質低下を許容できる場合がある |
| 音楽 | 非可逆圧縮を利用できる | 聞き取りにくい情報などを減らせる |
| 動画 | 非可逆圧縮を利用できる | 通信量や保存容量を大きく減らせる |
例えば、配布用プログラムを圧縮した場合、展開後のデータは元のプログラムと完全に同じでなければなりません。
ハッシュ値を使ってファイルが一致しているか確認する場合も同様です。元のファイルから1ビットでも変化すれば、通常はハッシュ値も変化するため、完全な復元が必要なデータには可逆圧縮を使用します。
一方、Webページに掲載する写真などでは、多少の画質低下を許容してデータ量を小さくすることができるため、非可逆圧縮が適していることがあります。
ZIP
ZIPは、複数のファイルやフォルダを一つのファイルにまとめられるアーカイブ形式であり、通常は可逆圧縮も行います。
例えば、
report.docx
data.csv
image.png
などをまとめて、
files.zip
という一つのファイルにできます。
ZIPで圧縮したデータは、展開すれば元のファイルを完全に復元できます。
ただし、ZIPにすれば必ず大幅に小さくなるわけではありません。
JPEGやMP3などは、もともと圧縮された状態で保存されているため、さらにZIPで圧縮してもほとんど小さくならない場合があります。
つまり、圧縮効果は圧縮方式だけでなく、元データにどの程度の規則性や冗長性が残っているかにも左右されます。
JPEG・GIF・BMP
画像形式によって圧縮方法も異なります。
JPEG
JPEGは、主に写真に使われる画像形式で、一般的には非可逆圧縮を利用します。
人間が気付きにくい細かな情報を減らすことで、写真を比較的小さなデータ量で保存できます。
ただし、圧縮を強くすると画質が低下します。
GIF
GIFで使用される圧縮そのものは可逆圧縮です。
ただし、GIFは扱える色数に制限があるため、多数の色を含む写真をGIFに変換すると、変換の段階で色が失われる場合があります。
BMP
BMPはラスタ形式の画像形式であり、画素を並べて画像を表します。
BMPには複数の形式がありますが、一般には画素データをほぼそのまま格納する非圧縮の形式がよく使われます。そのため、同じ大きさ・色数のJPEGなどと比べると、ファイルサイズが大きくなりやすいです。
MP3
MP3は、音声データを圧縮して保存するために広く使われている形式です。
一般的なMP3では非可逆圧縮を行います。
人間の聴覚特性を利用し、聞き取りにくい音などの情報を減らすことで、元のPCM音声などより大幅にデータ量を減らすことができます。
したがって、MP3を展開しても、圧縮前の音声データとビット単位で完全に同じ状態には戻りません。
動画の圧縮
動画は、多数の静止画像を短い時間間隔で次々に表示することで動きを表しています。
例えば1秒間に30枚の画像を表示する動画なら、
1秒間 → 30フレーム
です。
各フレームをそのまま保存すると非常に大きなデータ量になるため、動画ではさまざまな圧縮が行われます。
各フレームを圧縮する
一つの方法は、それぞれのフレームを静止画像のように圧縮することです。
各フレームのデータ量を減らせば、動画全体のデータ量も減らせます。
フレーム間の違いを利用する
動画では、隣り合うフレームの内容がほとんど同じことが多くあります。
例えば、固定したカメラで列車を撮影すると、
などはほとんど変化せず、主に列車の位置だけが変化します。
そこで、
前のフレームと変化した部分を中心に記録する
ことでデータ量を小さくできます。
このため、カメラを三脚に固定すると背景が安定し、フレーム間の共通部分が多くなりやすくなります。
反対に、
- カメラを左右に動かす
- 拡大・縮小する
- 不規則に揺らす
と背景を含む広い範囲がフレームごとに変化するため、単純に考えればフレーム間の差分を利用した圧縮の効率は低くなりやすくなります。
実際の動画圧縮では、物体の移動を予測する動き補償など、より高度な技術も利用されています。
ビットレートと画質
動画や音声では、ビットレートも重要です。
ビットレートは、
1秒間に使用するデータ量
を表し、例えば
5 Mbps
なら、1秒当たり約5Mビットのデータを使用することを意味します。
同じ解像度やフレームレートの動画であっても、圧縮後のビットレートを大きく下げれば、1秒間に記録できる情報量が減ります。
その結果、
- 細部がぼやける
- ブロック状の乱れが見える
- 動きの激しい部分が崩れる
などの圧縮アーティファクトが目立つことがあります。
非可逆圧縮を繰り返した場合
非可逆圧縮では、一度圧縮すると一部の情報が失われます。
例えば、
元画像
↓
JPEGで保存
↓
展開
↓
再びJPEGで保存
という処理を繰り返すと、再保存のたびに新たな近似や丸めが行われ、画質劣化が累積する場合があります。
一度失われた情報は、展開しても元には戻りません。
そのため、何度も編集する画像や動画では、
- 編集中は非可逆圧縮を繰り返さない
- 高品質なデータを保存しておく
- 用途に適した編集用形式を利用する
といった考え方が重要になります。
動画の用途と圧縮方式
動画の圧縮方法は用途によって選ぶ必要があります。
ネット配信用
ネット配信では、
などのバランスが重要です。
そのため、高い圧縮効率をもつ非可逆圧縮が利用されることが多くあります。
編集・保存用
何度も編集する動画では、再圧縮による画質劣化や編集のしやすさを考える必要があります。
そのため、配信用とは異なる設定や圧縮方式を選ぶことがあります。
圧縮前後のデータ量
圧縮に関する問題では、圧縮前後のデータ量を計算することも多くあります。
例えば、圧縮前が
15Mバイト
で、圧縮後の大きさが元の40%なら、
15×0.40=6Mバイト
となります。
ただし、「圧縮率」という言葉は文脈によって意味が異なる場合があるため注意が必要です。
例えば、
圧縮後のデータ量が元の40%
という意味なら、
圧縮後 ÷ 圧縮前 = 0.40
です。
一方、
データ量を40%削減した
という意味なら、
圧縮後 ÷ 圧縮前 = 0.60
となります。
問題では、「圧縮後が何%になるのか」「何%削減するのか」を確認して計算することが重要です。
削減割合
例えば、400バイトのデータを250バイトに圧縮したとします。
削減したデータ量は、
400-250=150バイト
です。
圧縮前に対する削減割合は、
150÷400=0.375
となります。
したがって、
削減割合 = 0.375
削減率 = 37.5%
です。
一方、圧縮後に残っている割合は、
250÷400=0.625
つまり62.5%です。