* octave で画像処理 - 画像の縮小 nearest neighbor 法 [#xa664497]

画像の縮小においてもアンチエイリアジングフィルタが必要になることがわかりました.
というわけで,アンチエイリアジングフィルタとして nearest neighbor 法を使ってみましょう.

** 重み付け係数 [#feda61a7]

画像の拡大のときと同じ係数を使ってみます.

|1|1|
|1|1|

** フィルタリング [#sd80d225]

 octave:1> [ x m a ] = imread ( 'gaishi.jpg' );  # 画像の読み込み
 octave:2> x = double ( x )/255;                 # double 型に変換
 octave:3> h = [ 1 1; 1 1];                      # 重み付け係数
 octave:4> xh(:,:,1) = conv2 ( x(:,:,1), h );    # RGB 各プレーンをフィルタリング
 octave:5> xh(:,:,2) = conv2 ( x(:,:,2), h );
 octave:6> xh(:,:,3) = conv2 ( x(:,:,3), h );
 octave:7> imshow ( xh );                        # 画像のプレビュー

#ref(gaishi_nn_sat.jpg,center)

あひゃ.サチってます.
よく考えてみたら,この重み付け係数だと 4 画素分の明るさが足し合わされてることになりますね.
というわけで,4 で割ってやります.

 octave:8> imshow ( xh/4 );

#ref(gaishi_nn.jpg,center)

今度はマトモな明るさになりました.

最初から重み付け係数を

|1/4|1/4|
|1/4|1/4|

としてやればよかったですね.

** 間引き [#x9c517de]

 octave:11> x2 = resample( xh/4, 2 );
 octave:12> imshow ( x2 );

#ref(gaishih_nn.jpg,center)

単純な間引きに比べて碍子の部分が自然な感じになってますね.

** 結局は [#y3ee3a1a]

元画像の 4 画素の平均値を 1 画素に変換する処理をしていることになります.

フィルタリングした後で画素を間引きするので,間引かれて縮小後の画像に現れない部分の計算はムダになります.
実用的なプログラムを組む場合は,捨てる画素の計算は端折るようにしたほうが良いでしょう.
これは nearest neighbor 法に限らず他のフィルタにも言えることです.

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