ウェーブレット変換と JPEG 2000 の仕組み - 多重解像度解析による画像圧縮
ウェーブレット変換の基本概念 - 時間と周波数の同時解析
ウェーブレット変換 (Wavelet Transform) は、信号を異なるスケール (解像度) と位置で分析する数学的手法です。フーリエ変換が信号全体の周波数成分を抽出するのに対し、ウェーブレット変換は「どの位置に、どのスケールの成分があるか」を同時に把握できます。画像圧縮では、この多重解像度解析の性質が効率的な符号化を可能にします。
フーリエ変換との違い:
フーリエ変換は時間 (空間) 情報を完全に失い、周波数情報のみを提供します。短時間フーリエ変換 (STFT) は窓関数で局所化しますが、窓サイズが固定のため時間分解能と周波数分解能のトレードオフが生じます。ウェーブレット変換は、高周波成分には狭い窓 (高い時間分解能)、低周波成分には広い窓 (高い周波数分解能) を自動的に適用し、このトレードオフを最適化します。
マザーウェーブレット:
ウェーブレット変換の基底関数はマザーウェーブレット ψ(t) と呼ばれ、これをスケーリング (伸縮) とシフト (平行移動) することで分析関数群を生成します。ψ_a,b(t) = (1/√a) × ψ((t-b)/a) の形式で、a がスケール、b が位置パラメータです。画像圧縮では Daubechies ウェーブレットや CDF 9/7 ウェーブレットが広く使用されています。
2D ウェーブレット変換:
画像への適用では、行方向と列方向に 1D ウェーブレット変換を順次適用します。1 レベルの分解で、画像は 4 つのサブバンドに分割されます: LL (低周波-低周波)、LH (低周波-高周波: 水平エッジ)、HL (高周波-低周波: 垂直エッジ)、HH (高周波-高周波: 対角エッジ)。LL サブバンドをさらに分解することで、多重解像度表現が得られます。
離散ウェーブレット変換 (DWT) とフィルタバンク
離散ウェーブレット変換 (DWT: Discrete Wavelet Transform) は、フィルタバンク構造で効率的に実装されます。ローパスフィルタとハイパスフィルタのペアで信号を分解し、ダウンサンプリングすることで多重解像度分解を実現します。
分析フィルタバンク:
入力信号をローパスフィルタ h0 (スケーリング関数に対応) とハイパスフィルタ h1 (ウェーブレット関数に対応) に通し、それぞれ 2 倍のダウンサンプリングを行います。ローパス出力は近似係数 (Approximation)、ハイパス出力は詳細係数 (Detail) と呼ばれます。近似係数をさらに分解することで、多段の分解が可能です。
合成フィルタバンク:
逆変換では、各サブバンドを 2 倍にアップサンプリングし、合成フィルタ g0, g1 を通して加算します。完全再構成条件を満たすフィルタ設計により、情報の損失なく元の信号を復元できます。これが可逆 (ロスレス) 圧縮の基盤となります。
CDF 9/7 ウェーブレット:
JPEG 2000 の非可逆圧縮で使用される Cohen-Daubechies-Feauveau 9/7 ウェーブレットは、9 タップのローパスフィルタと 7 タップのハイパスフィルタで構成されます。対称性を持つバイオルソゴナルフィルタで、線形位相特性により画像のエッジ付近でのアーティファクトが少ないのが特徴です。リフティングスキーム実装により、乗算回数を削減した高速計算が可能です。
CDF 5/3 ウェーブレット:
JPEG 2000 の可逆圧縮で使用される CDF 5/3 ウェーブレットは、整数演算のみで実装可能です。フィルタ係数が有理数で表現できるため、丸め誤差なしの完全再構成が保証されます。圧縮率は CDF 9/7 に劣りますが、医療画像やアーカイブなど情報損失が許容されない用途に適しています。
JPEG 2000 の圧縮パイプライン
JPEG 2000 は、ウェーブレット変換をベースとした画像圧縮規格で、2000 年に ISO/IEC 15444 として標準化されました。従来の JPEG (DCT ベース) と比較して、低ビットレートでの画質向上、可逆・非可逆の統一フレームワーク、プログレッシブ伝送などの利点を持ちます。
圧縮の全体フロー:
1. 前処理 (DC レベルシフト、色空間変換 RGB→YCbCr)。2. タイル分割 (オプション、大きな画像を独立に処理可能なタイルに分割)。3. DWT (CDF 9/7 または CDF 5/3 で 5-6 レベル分解)。4. 量子化 (各サブバンドの係数をステップサイズで除算し丸め)。5. EBCOT 符号化 (ビットプレーン符号化 + 算術符号化)。6. パケット化とコードストリーム生成。
タイル分割:
大きな画像 (衛星画像、医療画像など) では、画像をタイルに分割して独立に処理します。タイルサイズは通常 256 × 256から 1,024 × 1,024 ピクセルです。タイル境界でのアーティファクトを軽減するため、タイル間のオーバーラップや境界処理が行われます。タイルなしの処理も可能で、小さな画像ではタイル分割しない方が圧縮効率が高くなります。
量子化:
DWT 係数を量子化することで情報を削減します。各サブバンドに異なるステップサイズ Δ を設定し、係数を q = sign(c) × floor(|c|/Δ) で量子化します。ステップサイズが大きいほど圧縮率は高くなりますが、画質は低下します。可逆モードでは量子化を行わず (Δ=1)、係数をそのまま符号化します。
JPEG との比較:
- ブロックノイズ: JPEG は 8×8 ブロック単位の DCT のため、低ビットレートでブロック境界が目立つ。JPEG 2000 はウェーブレットの重なり合う基底により、ブロックノイズが発生しない
- 圧縮効率: 同じ PSNR で比較すると、JPEG 2000 は JPEG より 20-30% 少ないビットレートで同等の画質を達成
- プログレッシブ表示: JPEG 2000 は品質・解像度・位置のプログレッシブ伝送をネイティブサポート
EBCOT - ビットプレーン符号化の仕組み
EBCOT (Embedded Block Coding with Optimized Truncation) は JPEG 2000 の核心的な符号化アルゴリズムです。各サブバンドをコードブロック (通常 64×64) に分割し、ビットプレーン単位で符号化することで、任意のビットレートでの切り捨て (トランケーション) を可能にします。
ビットプレーン符号化:
量子化された係数を MSB (最上位ビット) から LSB (最下位ビット) に向かって 1 ビットずつ符号化します。最初のビットプレーンは最も重要な情報 (大きな係数の符号と位置) を含み、後のビットプレーンは詳細を追加します。任意のビットプレーンで符号化を打ち切ることで、段階的な品質制御が可能です。
3 つの符号化パス:
各ビットプレーンは 3 つのパスで符号化されます。1. Significance Propagation Pass: 隣接する有意係数の周囲のビットを符号化。2. Magnitude Refinement Pass: 既に有意な係数の追加ビットを符号化。3. Cleanup Pass: 残りのすべてのビットを符号化。この分割により、重要度の高い情報から順に符号化されます。
MQ 算術符号化:
各パスの出力は MQ コーダ (算術符号化器) で圧縮されます。MQ コーダはコンテキスト適応型の算術符号化で、周囲のビットパターンに基づいて確率モデルを適応的に更新します。18 種類のコンテキストが定義されており、係数の空間的な相関を効率的に利用します。
レート制御:
EBCOT の最大の利点は、符号化後に任意のビットレートへの最適な切り捨てが可能な点です。各コードブロックの各パスに対して Rate-Distortion 最適化を行い、与えられたビットバジェットで最小の歪みを達成するパスの組み合わせを選択します。これにより、エンコード時にビットレートを正確に制御できます。
JPEG 2000 の応用と現在の位置づけ
JPEG 2000 は技術的に優れた規格ですが、Web での普及は限定的です。一方、特定の専門分野では標準規格として広く採用されています。その応用分野と、現在の画像圧縮エコシステムにおける位置づけを解説します。
デジタルシネマ (DCI):
映画のデジタル配信規格 DCI (Digital Cinema Initiatives) では、JPEG 2000 が唯一の圧縮フォーマットとして採用されています。4K (4,096 × 2,160) の各フレームを JPEG 2000 で圧縮し、MXF コンテナに格納します。12 ビット色深度、XYZ 色空間での高品質な圧縮が要求され、フレームあたり約 1.3MB (250Mbps at 24fps) のビットレートが使用されます。
医療画像 (DICOM):
医療画像の標準規格 DICOM では、JPEG 2000 の可逆圧縮が広く使用されています。CT、MRI、X 線画像など、診断に影響する情報損失が許容されない用途で、ロスレス圧縮により 2-3 倍のファイルサイズ削減を実現しています。16 ビット画像のサポートも重要な要件です。
衛星画像・地理情報:
衛星画像や航空写真の配信には JPEG 2000 が広く使用されています。巨大な画像 (数万×数万ピクセル) のプログレッシブ伝送と、ROI (Region of Interest) 符号化による部分的な高品質アクセスが、地理情報システム (GIS) での利用に適しています。
Web での位置づけ:
Web ブラウザでの JPEG 2000 サポートは Safari のみ (2023 年時点) で、Chrome や Firefox はサポートしていません。Web 用途では AVIF (AV1 ベース) や WebP が JPEG 2000 の技術的利点の多くをカバーしており、ブラウザサポートも広いため、Web 向けには AVIF/WebP が推奨されます。JPEG 2000 は専門分野での利用に特化した規格として位置づけられています。
実装と活用 - OpenJPEG と Python での処理
JPEG 2000 の実装ライブラリと、Python での読み書き・変換方法を解説します。実務での活用パターンと、ウェーブレット変換の実装についても紹介します。
OpenJPEG ライブラリ:
OpenJPEG は JPEG 2000 のオープンソース参照実装で、エンコード・デコードの両方をサポートします。C 言語で実装されており、多くの画像処理ソフトウェア (GDAL、ImageMagick、Pillow) のバックエンドとして使用されています。コマンドラインツール opj_compress と opj_decompress で直接変換が可能です。
Python での JPEG 2000 処理:
Pillow (PIL) は JPEG 2000 の読み書きをサポートしています。img.save('output.jp2', 'JPEG2000', quality_mode='rates', quality_layers=[20]) で圧縮率 20:1 のエンコードが可能です。Glymur ライブラリはより詳細な JPEG 2000 パラメータ制御を提供し、タイルサイズ、分解レベル、コードブロックサイズなどを指定できます。
PyWavelets による DWT 実装:
Python でウェーブレット変換を直接扱うには PyWavelets (pywt) ライブラリが最適です。coeffs = pywt.dwt2(image, 'db4') で 1 レベルの 2D DWT を実行し、(cA, (cH, cV, cD)) の形式で近似係数と詳細係数が得られます。多レベル分解は pywt.wavedec2(image, 'db4', level=5) で実行できます。
ウェーブレット圧縮の簡易実装:
教育目的の簡易圧縮は、DWT 後に小さな係数をゼロに設定 (閾値処理) し、逆変換で画像を再構成する方法で実現できます。coeffs = pywt.wavedec2(img, 'bior4.4', level=5) で分解し、各サブバンドの係数に閾値を適用して小さな値をゼロにします。ゼロ係数の割合が圧縮率に対応し、95% の係数をゼロにしても視覚的に許容可能な品質が得られることが多いです。これは JPEG 2000 の量子化ステップの簡略版に相当します。