次は,空間周波数領域でのフィルタリングを取り扱います.
空間領域では,畳み込み演算によって実現していたフィルタ処理が,空間周波数領域で行えるようになります.
ここでは,まず画像を空間領域(画素値の領域)から空間周波数領域(スペクトルの領域)へ変換する必要があります.
その方法は,フーリエ変換というものです.
したがって,空間周波数領域での処理の流れは以下のようになります.
なお,コンパイルするためには,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は,コピーして使っても動きません.タブ,スペースが区別されるからです.