周波数領域での画像処理 - FFT と DCT による解析・フィルタリングの実践
周波数領域とは - 空間領域との違いと変換の意義
画像処理には大きく分けて空間領域 (Spatial Domain) と周波数領域 (Frequency Domain) の 2 つのアプローチがあります。空間領域ではピクセル値を直接操作しますが、周波数領域では画像を正弦波の重ね合わせとして表現し、各周波数成分を個別に操作します。
なぜ周波数領域で処理するのか: 空間領域でのカーネル畳み込みは、カーネルサイズが大きくなると計算量が急増します。例えば 1,024 × 1,024画像に 64x64 のフィルタを適用する場合、空間領域では約 43 億回の乗算が必要ですが、周波数領域では FFT (O(N log N)) と要素ごとの乗算で済み、大幅に高速化されます。
周波数の直感的理解: 画像における「低周波」は緩やかな明暗の変化 (背景、大きな構造) を表し、「高周波」は急激な変化 (エッジ、テクスチャ、ノイズ) を表します。均一な領域は低周波成分のみで構成され、細かいテクスチャは高周波成分を多く含みます。
- 低周波成分: 画像全体の明るさ、大きな色の塊、滑らかなグラデーション
- 中周波成分: オブジェクトの輪郭、中程度のテクスチャ
- 高周波成分: 細かいエッジ、ノイズ、テキストの細部
この分解により、ノイズ除去 (高周波カット)、エッジ強調 (高周波ブースト)、圧縮 (不要な周波数成分の削除) が直感的に実現できます。JPEG 圧縮が DCT を採用しているのも、人間の視覚が高周波成分に鈍感であることを利用して効率的にデータを削減するためです。
離散フーリエ変換 (DFT) と FFT - 画像のスペクトル解析
離散フーリエ変換 (DFT: Discrete Fourier Transform) は、有限長の離散信号を周波数成分に分解する数学的変換です。2 次元 DFT を画像に適用すると、各空間周波数の振幅と位相が得られます。FFT (Fast Fourier Transform) は DFT を O(N log N) で計算する高速アルゴリズムです。
2 次元 DFT の計算: MxN 画像 f(x,y) の DFT は F(u,v) = ΣΣ f(x,y) × exp(-j2π(ux/M + vy/N)) で定義されます。結果は複素数配列で、振幅 |F(u,v)| がその周波数成分の強さ、位相 arg(F(u,v)) が位置情報を保持します。
Python/OpenCV での実装:
import numpy as np
dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)
magnitude = 20 * np.log10(np.abs(dft_shift) + 1)
fftshift は DC 成分 (周波数 0、画像の平均輝度) を中心に移動させる操作で、スペクトルの可視化に必須です。対数スケールで表示するのは、DC 成分と高周波成分の振幅差が非常に大きい (数桁) ためです。
スペクトルの読み方: 中心が低周波、外側が高周波を表します。水平方向のエッジは垂直軸上に、垂直方向のエッジは水平軸上にスペクトルが現れます。周期的なパターン (テクスチャ、モアレ) は特定の位置にピークとして現れるため、ノイズの特定と除去に活用できます。1,024 × 1,024画像の FFT は現代の CPU で約 10ms で計算可能です。
離散コサイン変換 (DCT) - JPEG 圧縮の核心技術
離散コサイン変換 (DCT: Discrete Cosine Transform) はフーリエ変換の実数版で、画像圧縮において最も重要な変換です。JPEG、MPEG、H.264/H.265 など主要な圧縮規格の基盤技術であり、画像処理エンジニアにとって必須の知識です。
DCT と DFT の違い: DFT は複素数を出力しますが、DCT は実数のみを出力します。また、DFT は信号を周期的と仮定するため境界で不連続が生じますが、DCT は偶対称拡張を行うため境界での不連続がなく、エネルギー集中性に優れます。同じ情報量を少ない係数で表現できるため、圧縮に適しています。
JPEG での DCT 適用プロセス:
- 画像を 8x8 ブロックに分割する
- 各ブロックに 2D-DCT を適用し、64 個の DCT 係数を得る
- 左上の係数 (DC 成分) がブロックの平均輝度、右下に向かうほど高周波成分
- 量子化テーブルで各係数を割り算し、高周波係数を 0 に近づける
- ジグザグスキャンで 1 次元配列に変換し、ランレングス符号化とハフマン符号化で圧縮
品質と圧縮率のトレードオフ: JPEG の品質パラメータ (1-100) は量子化テーブルのスケーリングファクターです。品質 75 で約 1/10、品質 50 で約 1/20 の圧縮率が得られます。品質 85 以上では人間の目にはほぼ劣化が認識できません。
Python での DCT 計算: from scipy.fft import dctn, idctn で N 次元 DCT が利用可能です。OpenCV では cv2.dct() で 2D-DCT を計算できますが、入力は float32 型である必要があります。8x8 ブロック DCT の計算量は 64 点で約 200 回の加減算と乗算で、非常に軽量です。
周波数フィルタリング - ローパス・ハイパス・バンドパスの設計
周波数領域でのフィルタリングは、スペクトルに対してマスク (フィルタ関数) を乗算することで実現します。空間領域での畳み込みと数学的に等価ですが、大きなカーネルサイズでは周波数領域の方が高速です。
理想フィルタ: カットオフ周波数 D0 で完全に遮断する矩形フィルタです。ローパスでは D(u,v) ≤ D0 の成分のみ通過させます。しかし、急峻な遮断はリンギング (ギブス現象) を引き起こし、画像にリング状のアーティファクトが発生します。実用には不向きです。
バターワースフィルタ: H(u,v) = 1 / (1 + (D(u,v)/D0)^(2n)) で定義される滑らかな遮断特性を持つフィルタです。次数 n が大きいほど急峻になります。n=2 が実用的なバランスで、リンギングを抑えつつ効果的なフィルタリングが可能です。
ガウシアンフィルタ: H(u,v) = exp(-D(u,v)² / (2D0²)) で定義されます。最も滑らかな遮断特性を持ち、リンギングが一切発生しません。空間領域のガウシアンぼかしと等価です。
実装手順:
- 画像に FFT を適用し周波数領域に変換
- フィルタ関数 H(u,v) を生成 (画像と同サイズ)
- スペクトルとフィルタを要素ごとに乗算: G = F × H
- 逆 FFT で空間領域に戻す
バンドパスフィルタ: 特定の周波数帯域のみを通過させるフィルタで、ローパスとハイパスの差分で構成します。周期的なノイズ (モアレ、電源ノイズ) の除去に有効です。ノッチフィルタはスペクトル上の特定のピーク (周期ノイズ) のみを除去する特殊なバンドリジェクトフィルタです。
実践応用 - ノイズ除去、エッジ検出、画像復元
周波数領域処理の実践的な応用例を、具体的なコードと数値結果とともに紹介します。空間領域では困難な処理も、周波数領域では直感的かつ効率的に実現できるケースが多くあります。
周期ノイズの除去: スキャン画像やセンサー画像に現れる周期的なノイズパターンは、スペクトル上で明確なピークとして現れます。そのピーク位置にノッチフィルタ (半径 5-10 ピクセルの円形マスク) を配置して除去します。空間領域のフィルタでは周期ノイズの完全除去は困難ですが、周波数領域では精密に除去可能です。
ウィーナーフィルタによる画像復元: ブレやデフォーカスで劣化した画像を復元する逆フィルタリングです。劣化モデル G = H × F + N (H: 劣化関数、N: ノイズ) に対し、ウィーナーフィルタ W = H* / (|H|² + K) を適用します。K はノイズ対信号比の推定値で、通常 0.001-0.01 の範囲です。
ホモモルフィックフィルタリング: 画像を照明成分 (低周波) と反射成分 (高周波) に分離し、照明の不均一性を補正する手法です。画像の対数を取り、FFT を適用し、低周波を抑制・高周波を強調するフィルタを適用後、逆 FFT と指数関数で元に戻します。暗い影の中のディテールを引き出す効果があります。
パフォーマンス比較: 1,024 × 1,024画像に対する 64x64 ガウシアンフィルタの処理時間を比較すると、空間領域の畳み込みが約 850ms に対し、FFT ベースのフィルタリングは約 25ms で、34 倍の高速化が得られます。ただし、小さなカーネル (3x3、5x5) では空間領域の方が高速です。損益分岐点はカーネルサイズ約 15x15 付近です。
ウェーブレット変換との比較と最新動向
FFT/DCT に加え、ウェーブレット変換も周波数解析の重要なツールです。それぞれの特性を理解し、用途に応じて使い分けることが実務では重要です。また、深層学習時代における周波数領域処理の位置づけも解説します。
ウェーブレット変換の利点: FFT は周波数情報のみを提供し、「どの位置にどの周波数があるか」という空間的な情報が失われます。ウェーブレット変換は時間-周波数解析 (画像では空間-周波数解析) を提供し、局所的な周波数特性を捉えられます。JPEG 2000 はウェーブレット変換を採用し、ブロックノイズのない高品質な圧縮を実現しています。
各変換の使い分け:
- FFT: 周期ノイズ除去、大域的なフィルタリング、畳み込みの高速化
- DCT: 画像・動画圧縮、ブロックベースの処理
- ウェーブレット: マルチスケール解析、局所的な特徴抽出、JPEG 2000
深層学習との融合: 近年、CNN の畳み込み層を周波数領域で実装する研究が進んでいます。FFC (Fast Fourier Convolution) は大きな受容野を効率的に実現し、画像修復タスクで優れた性能を示しています。また、周波数領域での特徴量を CNN の入力に追加することで、テクスチャ認識の精度が向上する報告もあります。
実装ライブラリの選択: NumPy の np.fft は汎用的ですが、大規模画像には PyFFTW (FFTW ラッパー) が 2-3 倍高速です。GPU 処理には CuPy の cupyx.scipy.fft や PyTorch の torch.fft が利用可能で、バッチ処理で 10-50 倍の高速化が期待できます。リアルタイム処理では OpenCV の cv2.dft() が最適化されており、単一画像の処理に適しています。