* octave で画像処理 - 画像の拡大 その 2 [#kd4ca03f]

画像の拡大の初歩である nearest neighbor 法について.

** nearest neighbor 法とは [#xda0cee8]

画像を n 倍に拡大する場合に画素をそのまま同じ輝度値の n x n に拡大する方法です.

 拡大前      拡大後
 
 □     →   □□
             □□

** 重み付け移動平均と畳み込み [#l3e4cafa]

上記の内容ならそのままプログラムを書けば実現はできますが,わざと回りくどいことをしてみます.

実は,nearest neighbor 法は,[[前回>日記/2010-04-10/octave で画像処理 - 画像の拡大 その 1]]の黒画素水増し画像に対し,近傍画素を

|1|1|
|1|1|

の重み付けで加算したものとして実現できます.
つまり,「重み付け移動平均」の一種として捉えることができます.

2次元の「重み付け移動平均」の計算は,conv2() という関数で計算できます(厳密にはちょっと違いますが,今回は目をつぶります).
conv は convolution, つまり「畳み込み」です.

 octave:1> [ x m a ] = imread ( 'gaishi.jpg' );   # 画像の読み込み
 octave:2> x = double ( x )/255;                  # double 型の変数に変換
 octave:3> x2 = magnify ( x, 2 );                 # 黒画素追加の水増し画像
 octave:4> h = [ 1 1; 1 1 ];                      # 重み付け係数行列
 octave:5> x2_nn(:,:,1) = conv2 ( x2(:,:,1), h ); # 畳み込み
 octave:6> x2_nn(:,:,2) = conv2 ( x2(:,:,2), h ); # R,G,B 各プレーンについて計算
 octave:7> x2_nn(:,:,3) = conv2 ( x2(:,:,3), h );
 octave:8> imshow ( x2_nn );                      # プレビューの表示

プレビューでは違いがわかりませんが,画像を保存すると確かに画素が拡大されています.
下の画像は JPEG 圧縮の影響で分かりにくくなってますが,PNG などのロスレス形式で保存すると,画素の境界が綺麗に見えると思います.


#ref(gaishi2_nn.jpg,center)

** 空間周波数領域では [#z32b953b]

拡大した画像を 2 次元 FFT にかけて,スペクトルを見てみます.

 octave:9> y2_nn = fft2 ( x2_nn );
 octave:10> imshow ( abs(swap2(y2_nn))/100 );

#ref(gaishi2_nn_f.jpg,center)

斜め方向のエイリアジングは除去できてますが,x 軸,y 軸方向のエイリアジングがうまく除去できていません.
また,中央のスペクトルも元々のものに比べ変形していますね.

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS