octave で画像処理 - 2 次元 FFT の意味 †前回は,いきなし 2 次元 FFT なんぞかましてしまったので,今回は 2 次元 FFT の意味と題して「空間周波数領域が何を表しているか」というあたりを見てみます. 空間周波数領域のある1点のみに値を設定し,他を0とすることで,値を設定した点が何を意味するかを見ます. とりあえず行列を作ります. octave:1> y = zeros(256); # 256x256 の零行列を作成 octave:2> y ( 3+1,4+1 ) = 1000; # 値を設定 行列の場合,y ( row, column ) という表記なので,引数の縦方向を先に指定したり,添字が1から始まったりと,普通のプログラミングと勝手が違うので注意しましょう. この行列の値を画像として表示します. octave:3> imshow ( y ); 逆 FFT にかけます. octave:5> x = ifft2 ( y ); 画像として表示してみます. octave:8> imshow ( real(x)*50 ); 実は,エイリアジング領域の値の設定をサボっているので,空間領域でも複素数の値になってしまってます. real() で実数部だけ抜き出しているのはそのためです. グラデーションのかかったシマシマ模様が現れました. 波の立っている水面のようになっているわけです. 波の数を数えてみましょう. 横方向には4,縦方向には3,ですね. この値…空間周波数領域で最初に値を設定した点の座標ですね. 空間周波数領域の他の象限については下図のようになります. 2 次元 FFT で得られた空間周波数領域での各点の値は,元の画像をこのような波の足し算と捉え,各要素に分解して表していることになります. |