別シリーズにて「ラプラシアン演算子」登場。当然、本シリーズにて「ラプラシアン・フィルタ」を練習済だよね、といって探してみたらまさかの不在デス。行き当たりばったりで練習してきているので「有名どころ」でも結構漏れてますなあ。これはイケないということで、今回は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なものどもは以下のとおり。
-
- sobel
- prewitt
- gaussian
- laplacian
- log
- average
- unsharp
- motion
今回実施例
調べてみたところ、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のみ比較のために並べてあります。
念のため、新規で練習したフィルタども(デフィルト・パラメータ)でのフィルタ配列が以下に。
一応、specialな奴らを網羅できた?ホントか?