octave で画像処理 - ギブズの現象 †タイトルでネタバレしてるような気もしますが,気にしないでいきます. しましま †先日の「空間周波数領域での画像拡大」法で拡大した画像の端をよく見ると,変なしましまが現れています. こいつは困りますね. 市松模様 †というわけで,今回はこんな画像を拡大してみます. 2x2 マスの白黒の市松模様です. やってみる †octave:1> x(:,:,1) = [ ones(128) zeros(128); zeros(128) ones(128) ]; # RGB各プレーンに市松模様を代入 octave:2> x(:,:,2) = [ ones(128) zeros(128); zeros(128) ones(128) ]; octave:3> x(:,:,3) = [ ones(128) zeros(128); zeros(128) ones(128) ]; octave:4> y = fft2(x); # 2次元FFT octave:5> y2 = magnify_f(y,2); # 空間周波数領域で画像拡大 octave:6> x2 = ifft2 ( y2 ); # 2次元逆FFT octave:7> imshow ( real(x2)*4); # 拡大画像の表示 こんな風になりました. 碍子画像と同様,画像 4 辺の端にしましまが現れています. が,同様のしましまが白黒の境目近辺にも現れています. 実はこれ,ギブズの現象と考えられます. ギブズの現象は,時間領域で変化が急峻なところ(方形波の立ち上がりなど)で起こる現象です. 変化が急峻な部分を有限の周波数成分で近似しようとしてもなかなか収束しない,つまり,変化が急峻な部分は高い周波数成分を多く含んでいる,とも言えます. この画像については,空間周波数領域で高い空間周波数成分(中身は all 0)を追加したたことで,結果的には「有限の周波数成分で近似を打ち切った」のと同じ状態になったしまったために現象が起きたわけです. なぜ画像の端で? †画像中央のしましまはギブズの現象で説明がつきました. が,なぜ画像の端でも同様の現象が生じているのでしょうか? というあたりを次回書く予定. octave で画像処理 - 名前に偽りあり †というわけで,前回の話の続き. フーリエ級数展開とフーリエ変換 †まずは,復習から. フーリエ級数展開とは
ものでしたね. で,フーリエ変換は,フーリエ級数の繰り返し周期→∞ の極限とも言えるもので
ものになります. 高速フーリエ「変換」とは †で,今回使っているのは 2 次元の高速フーリエ変換です. 高速フーリエ変換というからには,フーリエ変換の仲間なのでしょうか? 答えは「No」. 高速フーリエ変換はフーリエ変換の仲間ではなく,フーリエ級数展開の仲間です. もっとも,フーリエ級数展開とフーリエ変換は仲間なので,そういう意味では仲間かもしれません. が,「高速フーリエ変換はフーリエ級数展開とフーリエ変換のどちらに近いものか」と聞かれたら,「フーリエ級数展開」と答えざるを得ません. FFT では(時間領域では)有限のサンプル数を扱います. このサンプル列を(強引に)1 周期としてフーリエ級数展開をした結果が周波数スペクトルになる,と解釈されます. なぜそうなってしまうのか,というと
という理屈はあるのですが,ま,てきとーに聞き流してください. 2 次元 FFT では †2 次元 FFT でも同様の話が成り立ちます. つまり,2 次元 FFT では「元画像が無限につながった画像」の 1 周期分を切り出して「空間周波数スペクトルの繰り返し」の 1 周期分を得ていたわけです. ここで注目するのは「繰り返し」のつなぎ目の部分. すっぱり切られた画像を強引に繰り返しとみなしているので,つなぎ目の部分で急峻な変化となってます. これが「ギブズの現象」の生じる原因だと考えられます. |