Tweet

octave で画像処理 - 画像の拡大 その 2

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

nearest neighbor 法とは

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

拡大前      拡大後

□     →   □□
            □□

重み付け移動平均と畳み込み

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

実は,nearest neighbor 法は,前回の黒画素水増し画像に対し,近傍画素を

11
11

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

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 などのロスレス形式で保存すると,画素の境界が綺麗に見えると思います.

gaishi2_nn.jpg

空間周波数領域では

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

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

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


添付ファイル: filegaishi2_nn_f.jpg 520件 [詳細] filegaishi2_nn.jpg 469件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-04-11 (日) 02:19:56 (3577d)