手習ひデジタル信号処理(157) Scilab、{IPCV}、画像のフィルタ再び

Joseph Halfmoon

別シリーズにて「ラプラシアン演算子」登場。当然、本シリーズにて「ラプラシアン・フィルタ」を練習済だよね、といって探してみたらまさかの不在デス。行き当たりばったりで練習してきているので「有名どころ」でも結構漏れてますなあ。これはイケないということで、今回は2次元画像のフィルタについて再び練習してみます。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

ラプラシアン登場の別シリーズ記事

ラプラシアンが登場するのは以下の別シリーズ記事です。

忘却の微分方程式(173) Maxima、{vect}、ベクトル解析、ラプラシアン

みんな大好きフリーの数式処理ソフト、Maxima様を使ってベクトル解析のお勉強をするもの。グラディエント、ダイバージェンス、ローテーションときた後のラプラシアンです。3次元(あるいは2次元)空間の中の凸凹というか濃淡というかを計算するのにお役立ちの演算子です。ぶっちゃけ、画像処理で使われるラプラシアン・フィルタと同族(のハズ。知らんけど。)

フィルタを練習してる過去回記事

本シリーズでも、画像にフィルタをかけてます。

手習ひデジタル信号処理(136) Scilab、IPCVツールボックス、再び

では、 sobelフィルタ、gaussianフィルタをかけてます。

また以下では、エッジ検出のアルゴリズムとして、 canny、prewittなど使っております。

手習ひデジタル信号処理(137) Scilab、IPCVツールボックス、画像の解析と統計

しかし、どこにもlaplacianがおりませぬ。これは振り返って埋めておかねば。

Image Linear Filtering

さて、IPCVの中のImage Linear Filteringというカテゴリの中に、3関数が含まれております。こんな感じ。

    • imfilter
    • filter2
    • fspecial

最初の2つ、imfilter関数とfilter2関数はどちらも入力画像にフィルタ(配列)を適用して出力画像を得る関数です。違いは出力画像のフォーマットにあり、imfilter関数の出力は入力と要素同型、filter2関数は常にdouble型配列として出力されるみたい。

フィルタそのものは、2次元の配列で与えればよいので、任意のフィルタを自由に「設計」できます。しかし、お名前がついているような有名どころのフィルタについては専用の生成関数が用意されとります。それが fspecialデス。specialなものどもは以下のとおり。

    1. sobel
    2. prewitt
    3. gaussian
    4. laplacian
    5. log
    6. average
    7. unsharp
    8. motion
上記の4番目のlaplacianをやっておけばよかったのね。まあ、ついでといっては何ですが、過去回で触ってなかった4番目以降を全部やっておこうかと。信号処理素人老人は上記フィルタについて述べませぬ。Web上に解説多数あり、よろしく。手抜きだな。
今回実施例
fspecial関数に specialなフィルタ名を与えればフィルタ配列が返ってきます。各フィルタにはパラメータなどありますが、何も与えなければ「デフォルト値」が内部で設定されるお約束です。デフォルト値がいくらなのかは Scilab IPCVのHelpファイルにかかれており。しかし、今回2つのフィルタについては問題発覚。
まず log フィルタ(Laplacian of Gaussian filter)。以下のようにしてみたところエラー発生。
LogFilterError

調べてみたところ、fspecial関数の引数の与え方のような表面ではなく、もそっと奥の方に問題があるようです。そこで log フィルタはパスと。手抜きよな。

また、motionフィルタについては、何等かの初期値を与えてやらないとフィルタが返ってこない(デフォルト値なし)のようだったので、エイヤーで適当な値を与えてます。

im = imread(fullpath(getIPCVpath() + "/images/baboon.png"));
fsobel = fspecial('sobel');
fLaplacian = fspecial('laplacian');
fLog = fspecial('log');
fAverage = fspecial('average');
fUnsharp = fspecial('unsharp');
fMotion = fspecial('motion', 1, 1);
imSobel = imfilter(im, fsobel);
imLaplacian = imfilter(im, fLaplacian);
imAverage = imfilter(im, fAverage);
imUnsharp = imfilter(im, fUnsharp);
imMotion = imfilter(im, fMotion);
scf(0);
subplot(161); title('Original'); imshow(im);
subplot(162); title('Sobel'); imshow(imSobel);
subplot(163); title('Laplacian'); imshow(imLaplacian);
subplot(164); title('Average'); imshow(imAverage);
subplot(165); title('Unsharp'); imshow(imUnsharp);
subplot(166); title('Motion,1,1'); imshow(imMotion);

題材は、いつものお猿様顔です。過去回で既に練習済のフィルタのうちsobelのみ比較のために並べてあります。

結果が以下に。filterResults

念のため、新規で練習したフィルタども(デフィルト・パラメータ)でのフィルタ配列が以下に。filtersV

一応、specialな奴らを網羅できた?ホントか?

手習ひデジタル信号処理(156) Scilab、{IPCV}、stitching、画像連結 へ戻る

手習ひデジタル信号処理(158) Scilab、{IPCV}、im2col、画像の列行列化 へ進む