第5回CADセミナー@岐阜 演習5/周波数領域でのフィルタ

次は,空間周波数領域でのフィルタリングを取り扱います.
空間領域では,畳み込み演算によって実現していたフィルタ処理が,空間周波数領域で行えるようになります.

ここでは,まず画像を空間領域(画素値の領域)から空間周波数領域(スペクトルの領域)へ変換する必要があります.
その方法は,フーリエ変換というものです.

したがって,空間周波数領域での処理の流れは以下のようになります.

  1. 画像の読み込み:ハードディスクからchar型の配列へ.
  2. 画像のフーリエ変換:char型をdouble型に変換.
  3. スペクトルに対する処理:スペクトルは複素数で表される
  4. スペクトルの逆変換:周波数領域から空間領域へ
  5. 画像保存
演習は,以下の2つを行います. 以上を行うプログラムを作成し,処理結果の8ビット画像を得ることを目的とします. 表示系のプログラムは扱わず,前の演習同様,変換処理後に画像表示プログラムで表示します.

なお,コンパイルするためには,Makefileがすべて用意してありますので,makeを入力するだけで可能です.


画像のフーリエ変換,逆変換

この演習では,画像のフーリエ変換,逆変換を行って,その結果を保存します. 間では何もやりませんので,同じ画像が出てくるはずです.

フーリエ変換を行う関数に,FFT2(...)
として,用意しました.これは,fft_2D.cの中にあります.
この関数の中から1次元のフーリエ変換の関数をさらによんで2次元のフーリエ変換を実現しています. その詳細は省きます.なお,ファイルを分けて関数を書くこと,Makefileをつかうことも,前の演習と同じです.

あと,FFT2Dにはdouble型の配列を渡す必要があります.これは,スペクトルは複素数で表現されるためで, その配列を画像とは別に用意する必要があります.
さらに,その複素数の実部に画像の画素値を入れておく必要もあります.この作業は,convert.cの中の,
char2double(..)関数で行います.
逆変換後は,やはり実部に画像データが保存されるので,double型からchar型へ戻す必要があります. こちらの作業は,double2char(..)という関数(やはりconvert.cの中にあります)で実現しています.

main.cはこちら
fft_2D.cはこちら
convert.cはこちら
Makefileはこちら←Makefileは,コピーして使っても動きません.タブ,スペースが区別されるからです.


スペクトルへのフィルタ処理による高周波遮断フィルタ

この演習では,画像のフーリエ変換,逆変換を行って,その結果を保存します. フーリエ変換と逆変換の間では,画像がスペクトルに変換されています.そのスペクトルについて 処理を行って高周波遮断フィルタを作成します.

その方法は,スペクトルは2つのdouble型の配列を使った複素数で表現されているため, その値を変更することになります.

今回の演習では,画像のスペクトルは,周辺部が低周波領域,中心部が高周波領域になっていますので, スペクトルの中心部の値を強制的に0(ゼロ)にすることによって,画像の高周波成分を除去します.

その後,そのスペクトルを逆変換して画像(空間領域)に戻し,その配列を保存して表示します.

フーリエ変換を行う関数に,FFT2(...)
として,用意しました.これは,fft_2D.cの中にあります.

強制的にゼロに変換する関数は,filter.cの中の,freq_filtering(..)関数です.
この関数の中で,くり抜く正方形の大きさの1辺を入力することができます. main.cはこちら
fft_2D.cはこちら
convert.cはこちら
filter.cはこちら
Makefileはこちら←Makefileは,コピーして使っても動きません.タブ,スペースが区別されるからです.


以上,画像の空間周波数領域でのフィルタ処理例を示しました.まとめると, という演習を行いました.