画像圧縮とJPEG — 「気づかれない情報」から捨てる
数MBの生画素データが数百KBのJPEGになっても、見た目はほとんど変わらない。鍵は「人の目が気づかない情報から順に捨てる」という非可逆圧縮の哲学です。空間→周波数(DCT)→量子化→エントロピー符号化というJPEGのパイプラインを、1ブロック単位で解剖しながら動かします。
1. パイプライン全景 — 4段の変換
JPEG は約30年前の規格ですが、その構成は現代の画像・動画コーデックの原型そのものです。処理は次の4段。情報を実際に捨てるのは色の間引きと量子化だけで、残りの段は完全に可逆です。
| ステージ | やること | 狙い | 可逆性 |
|---|---|---|---|
| ① 色変換+間引き | RGB→YCbCr に変換し、色差 Cb/Cr を 1/2 に間引く(4:2:0) | 人の目は色の解像度に鈍感 | 非可逆 |
| ② 8×8 分割+DCT | 各ブロックを64個の周波数成分に分解 | エネルギーを低周波(左上)へ集中 | 可逆 |
| ③ 量子化 | 係数を量子化テーブルで割って整数に丸める | 高周波を粗く捨てる(唯一の主要な損失) | 非可逆 |
| ④ エントロピー符号化 | ジグザグスキャン+ランレングス+ハフマン | 大量の 0 を短いビット列に潰す | 可逆 |
2. 64枚の「波のタイル」 — DCT基底
8×8 ブロックの離散コサイン変換(DCT)は、64画素の輝度パターンを、64種類の「コサイン波タイル」=DCT基底の重み付き和として書き直します。どんな 8×8 ブロックも、この64枚のタイルの混ぜ合わせで完全に表現できます(DCTは直交変換で、この段階では情報は一切失われません)。
3. 1ブロックを追跡する — DCT → 量子化 → 復元
いよいよ本丸の量子化です。DCT係数 F(u,v) を、位置ごとに異なる値を持つ量子化テーブル Q(u,v) で割って整数に丸めます。テーブルは右下(高周波)ほど大きな値なので、高周波係数は激しく丸められ、その多くが0 になります。
4. 品質と圧縮率 — どこまで捨てられるか
品質設定を下げると量子化テーブル全体が大きくなり、非ゼロの係数がどんどん減ります。生き残った係数をジグザグスキャンで低周波→高周波の順に一列に並べると、末尾に 0 が延々と続く列になり、これがランレングス+ハフマン符号で極小のビット列に潰れます。非ゼロ係数の割合は、実際のファイルサイズのよい代理指標です。
客観画質の定番指標は PSNR(ピーク信号対雑音比)。元画像との平均二乗誤差 MSE に対して PSNR = 10 log10(2552/MSE) dB で、40dB 以上なら劣化はほぼ知覚できず、30dB を切ると明確に見えてきます。
5. まとめ — 非可逆圧縮の哲学
- 変換符号化:画素のまま捨てると必ず目立つ。周波数領域に移してから捨てると、知覚的な損失を最小にできる。
- 知覚モデル:人の目は「色の解像度」と「高周波の振幅誤差」に鈍感。量子化テーブルの右下が粗いのはその定量化。
- 量子化が唯一の損失:品質パラメータの正体は量子化テーブルのスケール。0 が増えるほどエントロピー符号化が効く。
- アーティファクトには名前がある:ブロックノイズはDC段差、モスキートノイズは高周波欠損によるリンギング。