octave で画像処理 - 空間周波数領域での画像拡大 †ここからは,独自研究色が強くなります. 理屈上は合ってるはずなので,モノの本を見れば多分論じているものはあるはずです. が,実はその手の本は全く持ってなかったりします. 理想のアンチエイリアジングフィルタ †これまでも何度も書いてきましたが,理想のアンチエイリアジングフィルタは
というものです. 実は,この様な条件を完璧に満たすフィルタを作ろうとすると,元画像と同サイズの重み付け係数が必要になります. 今までサンプルに使っていた 256 x 256 の画像の場合,重み付け係数のサイズも 256 x 256 になります. これでは計算量が爆発(O(N^4) になるのかな)してしまうので,現実のフィルタは
という二律背反な条件の間で妥協の元に設計されている,とも言えます. 理想的なスペクトルを捏造 †ここで,発想を逆転して
と考えてみます. つまり,手順としては以下のようになります.
やってみる †空間周波数領域で拡大する関数 magnify_f を作ります. function y = magnify_f (x,m) r = rows(x); c = columns(x); r2 = floor(r/2); c2 = floor(c/2); y(m*r,m*c,ndims(x)) = 0; for i = 1:ndims(x) y(:,:,i) = [x(1:r2, 1:c2, i ) zeros( r2, (m-1)*c ) x(1:r2, c2+1:c, i ); zeros( (m-1)*r, m*c ); x(r2+1:r, 1:c2, i ) zeros( r2, (m-1)*c ) x(r2+1:r, c2+1:c, i ) ]; endfor endfunction FFT にかけた直後の,並べ替えする前の行列に対して使うように書きました. octave:1> [ x m a ] = imread ( 'gaishi.jpg' ); # 画像を読み込んで octave:2> x = double (x)/255; # 実数型に変換 octave:3> y = fft2(x); # 2 次元 FFT にかけて octave:4> y2 = magnify_f(y,2); # スペクトルを捏造 octave:5> x2 = ifft2(y2); # 2 次元逆 FFT にかける octave:6> imshow (real(x2)); # 画像のプレビュー ありゃ,全体的に暗いですね. 画素が 4 倍に増えたので,明るさが 1/4 になってしまったようです. 4 倍してみます. octave:7> imshow (real(x2)*4); ここらは 2 次元 FFT / 2 次元逆 FFT の定義のしかたに依存するので,別の処理系で計算する場合は「4倍」ではない場合もあります.注意. |