Gaussian Filter と ダウンサンプリング
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(σ)に行う.この,ブラー→ダウンサンプリング→ブラー,を繰り返すことでカーネルのサイズ増加を防げている.これは
という関係を利用している.繰り返していけば
・・・
となる.
なお,画素を間引いてダウンサンプリングするには次のコマンドで一発.
img_dwn = imresize(source_img, scale);
第2引数のscaleがダウンサンプリング後との比になっている.1/2なら画像の縦横がそれぞれ1/2になる.
- Gausssian smoothing http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm
- fspecial http://www.mathworks.com/access/helpdesk/help/toolbox/images/fspecial.html
- imfilter http://www.mathworks.com/access/helpdesk/help/toolbox/images/imfilter.html
- SIFT http://www.vision.cs.chubu.ac.jp/SIFT/PDF/sift_tutorial.pdf