JA EN

周波数領域での画像処理 - FFT と DCT による解析・フィルタリングの実践

· 約 9 分で読めます

周波数領域とは - 空間領域との違いと変換の意義

画像処理には大きく分けて空間領域 (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 適用プロセス:

品質と圧縮率のトレードオフ: 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²)) で定義されます。最も滑らかな遮断特性を持ち、リンギングが一切発生しません。空間領域のガウシアンぼかしと等価です。

実装手順:

バンドパスフィルタ: 特定の周波数帯域のみを通過させるフィルタで、ローパスとハイパスの差分で構成します。周期的なノイズ (モアレ、電源ノイズ) の除去に有効です。ノッチフィルタはスペクトル上の特定のピーク (周期ノイズ) のみを除去する特殊なバンドリジェクトフィルタです。

実践応用 - ノイズ除去、エッジ検出、画像復元

周波数領域処理の実践的な応用例を、具体的なコードと数値結果とともに紹介します。空間領域では困難な処理も、周波数領域では直感的かつ効率的に実現できるケースが多くあります。

周期ノイズの除去: スキャン画像やセンサー画像に現れる周期的なノイズパターンは、スペクトル上で明確なピークとして現れます。そのピーク位置にノッチフィルタ (半径 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 はウェーブレット変換を採用し、ブロックノイズのない高品質な圧縮を実現しています。

各変換の使い分け:

深層学習との融合: 近年、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() が最適化されており、単一画像の処理に適しています。

関連記事

画像圧縮アルゴリズムの深層 - DCT、ウェーブレット変換、予測符号化の仕組み

画像圧縮の核心技術を深掘り解説。JPEG の DCT、JPEG 2000 のウェーブレット変換、H.265/AV1 の予測符号化、エントロピー符号化の数学的原理を理解します。

画像ノイズ除去の原理と実践 - デジタル写真のノイズリダクション完全ガイド

画像ノイズの発生原因から除去アルゴリズム、実践的なワークフローまで解説。高感度撮影や暗所撮影で発生するノイズへの対処法を紹介します。

フーリエフィルタリングによるノイズ除去 - 周波数領域での画像処理

フーリエ変換を用いた画像のノイズ除去手法を解説。DFT の原理、ローパス・ハイパスフィルタ、ノッチフィルタの設計と実装を紹介します。

ウェーブレット変換と JPEG 2000 の仕組み - 多重解像度解析による画像圧縮

ウェーブレット変換の原理から JPEG 2000 の圧縮アルゴリズムまで解説。DWT、サブバンド符号化、EBCOT の仕組みを具体例とともに紹介します。

ディザリング技術の種類と応用 - 限られた色数で階調を表現する手法

誤差拡散法、Bayer ディザリング、ブルーノイズなど各種ディザリング技術の原理と特性を比較し、レトロ表現から印刷まで応用例を解説します。

ブレ除去 (デブラー) の原理と実践 - モーションブラーからピンボケまで

画像のブレ除去技術を体系的に解説。ウィーナーフィルタ、ブラインドデコンボリューション、深層学習ベースの最新手法まで原理と実装を網羅します。

関連用語