Tweet


* octave で画像処理 - 2 次元 FFT の意味 [#t45aad8e]

[[前回>日記/2010-04-04/octave で画像処理 - 2 次元 FFT]]は,いきなし FFT なんぞかましてしまったので,今回は 2 次元 FFT の意味と題して「空間周波数領域が何を表しているか」というあたりを見てみます.
[[前回>日記/2010-04-04/octave で画像処理 - 2 次元 FFT]]は,いきなし 2 次元 FFT なんぞかましてしまったので,今回は 2 次元 FFT の意味と題して「空間周波数領域が何を表しているか」というあたりを見てみます.

空間周波数領域のある1点のみに値を設定し,他を0とすることで,値を設定した点が何を意味するかを見ます.

#ref(impulse_freq.png,center)

とりあえず行列を作ります.

 octave:1> y = zeros(256);          # 256x256 の零行列を作成
 octave:2> y ( 3+1,4+1 ) = 1000;    # 値を設定

行列の場合,y ( row, column ) という表記なので,引数の縦方向を先に指定したり,添字が1から始まったりと,普通のプログラミングと勝手が違うので注意しましょう.

この行列の値を画像として表示します.

 octave:3> imshow ( y );

#ref(impulse_freq_mat.png,center)

逆 FFT にかけます.

 octave:5> x = ifft2 ( y );

画像として表示してみます.

 octave:8> imshow ( real(x)*50 );

実は,エイリアジング領域の値の設定をサボっているので,空間領域でも複素数の値になってしまってます.
real() で実数部だけ抜き出しているのはそのためです.

#ref(impulse_space.png,center);

グラデーションのかかったシマシマ模様が現れました.
波の立っている水面のようになっているわけです.

波の数を数えてみましょう.
横方向には4,縦方向には3,ですね.
この値…空間周波数領域で最初に値を設定した点の座標ですね.

2 次元 FFT で得られた空間周波数領域での各点の値は,元の画像をこのような波の足し算と捉えて各要素に分解して表していることになります.
空間周波数領域の他の象限については下図のようになります.

#ref(space_frequency_quadrant.png,center,50%)

2 次元 FFT で得られた空間周波数領域での各点の値は,元の画像をこのような波の足し算と捉え,各要素に分解して表していることになります.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS