2008/03/11

Matlabで画像処理フィルタを書く

要: Matlab + Image Processing Toolbox

数ヶ月ぶりに画像解析をしているがMatlab programmingを結構忘れてしまっている.そこで画像フィルタを書く方法を復習がてらまとめておく.そもそも画像の平滑化や鮮鋭化,エッジ検出などは,元の画像に沿って移動しつつフィルタとなる行列(マスクとかカーネルとかいう)をconvolutionするという行為だ.つまり
#カーネルを作成
#画像を移動しつつカーネルを加重加算する (convolution)
の2つをやる.カーネルを工夫することで様々なフィルタを作ることができる.

さて本題へ.

Image Processing Toolbox でカーネルを作るには fspecial という関数を使うと楽だ.ガウシアンフィルタを作りたい場合は,
>> h = fspecial('gaussian',hsize,sigma)
とするだけ.hsizeにはカーネルサイズ(ようは行列の高さ),sigmaにはガウス分布の標準偏差.gaussianのところをlaplacianとかsobelとかaverageにすればそういったフィルタになる.これは楽チン.

問題は convolutionだ.画像にそってカーネルをあてていくと画像をはみだすのでそのときの例外処理を書く必要がある,いわゆる周辺処理というやつ.これが結構面倒なので conv2関数とかfor文で書くのは萎えるのだが,Image Processing Toolboxにある imfilterを使うと,周辺処理をよきにはからうことができる.しかもカーネルにはfspecialの戻り値をそのまま引数にとることができる.

>> image_g = imfilter(image, h, 'replicate');

imageが元画像の行列で,hがfspecialの戻り値.第3引数が周辺処理をしている部分.replicateは最近傍の配列境界値を使うという設定.ここに数値を入れておけば強制的にその値にできたり,そのほかにもいろいろある.ヘルプをみてね.

例: 15x15の行列で標準偏差が6のガウシアンフィルタを作り,Googleのトップアイコンをフィルタリングする.
<<<
image = imread('http://www.google.com/intl/en_ALL/images/logo.gif');
h = fspecial('gaussian', 15, 6);
image_g = imfilter(image, h, 'replicate');
subplot(1,2,1);
imshow(image); title('Original Image');
subplot(1,2,2);
imshow(image_g); title('Gaussian Filtered Image');
>>>

気が向いたらRでやってみようかな.

{{image 0, '画像の説明', nil, [665,146]}}