画像圧縮と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は直交変換で、この段階では情報は一切失われません)。

F(u,v) = ¼ C(u)C(v) Σx=07 Σy=07 f(x,y) cos[(2x+1)uπ/16] cos[(2y+1)vπ/16] C(0) = 1/√2, それ以外は 1。u が横方向、v が縦方向の周波数。F(0,0) はブロックの平均輝度(DC成分)
DCT基底の図鑑 — 64枚のタイルから1枚選ぶ(クリックで選択)
左のグリッドが64種の基底。右上に行くほど横の縞が細かく(u 大)、左下に行くほど縦の縞が細かく(v 大)なります。左上 (0,0) は「のっぺり一定」=平均輝度。1枚選んで係数スライダーを動かすと、灰色ブロックにその基底がどう「混ざる」かが見えます。実画像のブロックはこの64枚の重み付き和です。
POINT — なぜDCTなのか 自然画像の隣接画素は強く相関するため、DCTするとエネルギーの大半が左上(低周波)の少数の係数に集中します。この「エネルギー集中」が圧縮の源泉で、相関の強い信号に対してDCTは理論最適な変換(KL変換)の優秀な近似になることが知られています。FFTと違い実数だけで済み、ブロック境界の不連続も生じにくいのが採用の決め手でした。

3. 1ブロックを追跡する — DCT → 量子化 → 復元

いよいよ本丸の量子化です。DCT係数 F(u,v) を、位置ごとに異なる値を持つ量子化テーブル Q(u,v) で割って整数に丸めます。テーブルは右下(高周波)ほど大きな値なので、高周波係数は激しく丸められ、その多くが0 になります。

F̂(u,v) = round( F(u,v) / Q(u,v) ) 復号時は F̂ × Q で戻すが、丸めた端数は永遠に戻らない。品質設定は Q 全体のスケールを変えているだけ
8×8ブロックのJPEG圧縮 — 4パネルで追う(元画像クリックでブロック選択)
① 選んだ 8×8 ブロック → ② DCT係数(青が濃いほど大きい。左上に集中している点に注目) → ③ 量子化後(緑=非ゼロ。品質を下げるとほぼ全部 0 に) → ④ 逆DCTによる復元。平坦部は少数の係数で完璧に戻るのに、エッジ部やテクスチャ部は品質を下げると崩れます。
注意 — 捨てているのは量子化だけ、だからこそ DCTもジグザグもハフマンも可逆。画質を決めるのは量子化テーブルただ一つです。そして丸めで失った高周波は二度と戻りません。JPEGを開いて再保存するたびに量子化が再実行され、誤差が蓄積していく世代劣化が起きるのはこのためです。編集の中間ファイルに JPEG を使ってはいけません。

4. 品質と圧縮率 — どこまで捨てられるか

品質設定を下げると量子化テーブル全体が大きくなり、非ゼロの係数がどんどん減ります。生き残った係数をジグザグスキャンで低周波→高周波の順に一列に並べると、末尾に 0 が延々と続く列になり、これがランレングス+ハフマン符号で極小のビット列に潰れます。非ゼロ係数の割合は、実際のファイルサイズのよい代理指標です。

客観画質の定番指標は PSNR(ピーク信号対雑音比)。元画像との平均二乗誤差 MSE に対して PSNR = 10 log10(2552/MSE) dB で、40dB 以上なら劣化はほぼ知覚できず、30dB を切ると明確に見えてきます。

品質 vs 圧縮率 vs 画質 — ブロックノイズとモスキートノイズ
品質を 10 以下まで下げてみてください。平坦部に 8×8 の格子模様(ブロックノイズ:各ブロックがDC成分だけになり段差が見える)、エッジや細線の周りにさざ波(モスキートノイズ:エッジ再現に必要な高周波が失われたリンギング)が現れ、誤差画像(×4強調)で発生場所が確認できます。右は係数を1列に読み出すジグザグスキャンの順序アニメです。

5. まとめ — 非可逆圧縮の哲学

一歩先へ — JPEGの子孫たち この設計思想はそのまま進化を続けています。WebP/AVIF/HEIC は動画コーデック(VP8/AV1/HEVC)のブロック変換+高度なイントラ予測を静止画に転用したもの。JPEG XL は可変ブロックサイズDCTと知覚色空間で同画質を約半分のサイズにします。さらに研究の最前線は、オートエンコーダで変換と量子化自体を学習するニューラル画像圧縮 — 「何を捨てるか」をデータから学ぶ時代に入っています。