前々回、画像用のフィルタ関数があるのに「わざわざ普通のコンボルーション処理用の」conv2関数で画像をフィルタしてみました。今回は、本物の画像用の関数を使ってみたいと思います。冒頭のお猿様の画像、ちょいといつもよりボケてないっすか?ガウシアンフィルタの賜物?であります。でもさすがScilab、1つじゃないんだ関数が。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。
今回試用してみる画像フィルタ用関数
今回使う関数群はすべてATOMSからインストールした以下のツールボックスに所蔵のものばかりです。なお、インストールの件は第69回でやっとります。
Image Processing & Computer Vision
関数的には以下の3つです。
-
- fspecial
- filter2
- imfilter
第1のfspecialはフィルタを生成する関数です。最初、空間的なフィルタを作るものであるので “fspatial?” に見えましたが老眼の見間違いです。specialっす。ありがちな(special)な2Dフィルタを作ってくれるもの。前々回ではsobelフィルタをかけるために、わざわざ手で3x3の配列を入力してました。が、fspecial関数を使えば
fspeciial(‘sobel’)
でフィルタの配列が得られます(細かくいうとバーチカルな奴。ホリゾンタルにしたければ転置せよということ?)
毎度sobelでは進歩がない?ので今回はガウシアンフィルタです。「ボカシ」(ボケではないのよ)フィルタです。画像がぼんやりしてまいりますな。2次元で正規分布を計算しないとならないので自力で計算で求めようとすると結構メンドイです。しかし、この関数を使えばお楽。
F = fspecial('gaussian', [13,13], 2.5);
上記で13x13サイズ、σ=2.5のガウシアン・カーネルが手に入ります。なお、デフォルトは3x3サイズでσ=0.5でした。デフォルトだとお猿様のお顔がオリジナルからほとんど変化のない厳しい顔でした。そこで上記のように広くきつくボケをかましてみました。
第2と第3の関数は、どちらもフィルタを画像に適用する関数です。2つの「決定的な」違いは、filter2関数は、入力画像が整数値画像であろうと結果は実数になり、imfilter関数の方は入力画像が整数値画像なら整数値のままというところであります。前回、Scilabの整数、実数の変換についてやりましたが、画像を扱う場合は避けてとおれませぬ。
ガウシアンフィルタをかけてみた結果
以前の回で、baboon画像を白黒化したものをbaboonGrayというお名前でセーブしてあったので、それを読み込んでフィルタをかけていきます。こんな感じ。
imBG = imread("image\baboonGray.png"); F = fspecial('gaussian', [13,13], 2.5); im2 = filter2(imBG, F); imI = imfilter(imBG, F);
これで、im2には結果実数のフィルタ結果が、imIには結果整数のフィルタ結果が入っている筈。変数ブラウザで確認するとこんな感じ。
doubleと整数、よろしかろうかと。
さて imI 画像の方は整数型(グレイスケール)のまま「ボケている」ので画像の表示は素直に
imshow(imI)
しかし、実数型のim2画像の方を同様に imshow(im2)などとしようものなら「真っ白」な画像がみえてしまいます。
計算結果をみれば、0.0から256.0の範囲の実数になっているようです。一方、imshow()は実数型も「食え」るみたいですが、その場合0から1の範囲でないと正常なグレースケール表示してくれないみたいっす。1以上はみんな真っ白ねという感じか。そこでちょいと手をいれ
im20 = im2 / 256.0; imshow(im20)
上記のようにスケーリングしてやれば、お猿様のご尊顔を拝せます。まあ整数型の時と見た目同じなので掲げませぬが。