Gaussian Filter と ダウンサンプリング

matlabガウスカーネルを作成.

g_kernel = fspecial('gaussian',hsize,sigma);

第1引数がカーネルの種類で,それ以降の引数は種類による.今回はガウシアンカーネルなので第2引数でカーネルサイズ(行列の大きさ),第3引数でガウス分布標準偏差を指定する.作成したカーネルと元画像の畳込みをすれば平滑化された画像が得られるが,2次元画像の畳込みには2重ループが必要.matlabの多重ループは遅いので,あらかじめ用意された関数を使用する.

img_g = imfilter(image,g_kernel,'replicate');

imfilter関数を使ってフィルタリングする.第3引数は境界条件を指定するオプション.平滑化を行った後に,画素を間引いてダウンサンプリングを行う.
カーネルの大きさとσの関係だが,σが大きくなるほどカーネルのサイズを大きくする必要があり,計算量も増えていく.3x3,5x5,7x7などが使われるらしく,OpneCVのダウンサンプリングを行う関数のカーネルは5x5らしい.
SIFTではσの値が大きい場合の畳込みの計算量を減らすため(カーネルの大きさを抑えるため),まず元画像を2σで平滑化した画像L1(2σ)を1/2にダウンサンプリングしてL2(σ)を得る.次に同じサイズのカーネルでσ〜2σまでの畳み込みをL2(σ)に行う.この,ブラー→ダウンサンプリング→ブラー,を繰り返すことでカーネルのサイズ増加を防げている.これは
\reverse\opaque L1 \left( 2  \sigma \right)  \approx L 2  \left( \sigma  \right)
という関係を利用している.繰り返していけば
\reverse\opaque L1 \left( 4 \sigma  \right) \approx L2 \left( 2 \sigma \right) \approx L3 \left( \sigma \right)
\reverse\opaque L1 \left( 8 \sigma  \right) \approx L2 \left( 4 \sigma \right) \approx L3 \left( 2 \sigma \right)  \approx L4 \left( \sigma \right)
・・・
となる.

なお,画素を間引いてダウンサンプリングするには次のコマンドで一発.

img_dwn = imresize(source_img, scale);

第2引数のscaleがダウンサンプリング後との比になっている.1/2なら画像の縦横がそれぞれ1/2になる.