手習ひデジタル信号処理(141) Scilab、{IPCV}、モルフォロジー処理その2

Joseph Halfmoon

今回は前回の訂正から入らねばなりませぬ。前回「モフォロジー」と記してましたが「モルフォロジー」と記すのが良いようです。またバッサリ2値白黒画像の処理と断定してましたが、カラー画像にも適用可能です。ステンシルプレートのような2値画像に適用する場合が「応用し易い」だけのこと。お詫びして訂正させていただきます。

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

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

前回実施のerode(収縮)処理をカラー画像に適用

前回、白黒2値画像に処理を適用しただけであった処理をカラー画像に適用した例としてErode(収縮)処理を行ってみます。モデルはいつものお猿様。

imB = imread(fullpath(getIPCVpath() + "/images/" + 'baboon.png'));
se5 = imcreatese('rect',5,5);
imBerode = imerode(imB, se5);
subplot(121); imshow(imB);
subplot(122); imshow(imBerode);

結果が以下に。左がオリジナルで右がimerode処理したものです。右の方が「明るいエリアが収縮している」雰囲気でてますかね。目玉のところがそんな気がしますがBaboonErode

bwborder処理

関数のいくつかはカラー画像も処理できることは分かりましたが、やっぱり2値画像はこのカテゴリの中心みたいです。2値画像からボーダー(境界)を抽出するための関数 bwborder の例が以下に。

C = imread(fullpath(getIPCVpath() + "/images/" + 'coins_gray.jpg'));
Cbw = im2bw(C, 0.5);
CbwB = bwborder(Cbw, 4);
SQ = imread(fullpath(getIPCVpath() + "/images/big_sq.png"));
SQbw = im2bw(SQ, 0.5);
SQbwB = bwborder(SQbw, 4);
subplot(231); imshow(C);
subplot(232); imshow(Cbw);
subplot(233); imshow(CbwB);
subplot(234); imshow(SQ);
subplot(235); imshow(SQbw);
subplot(236); imshow(SQbwB);

結果画像が以下に。左からオリジナル、2値化画像、そしてbwborder適用後です。右端でボーダーが白抜きになっているのが分かりますな。bwborder

トップハット、ブラックハットって何よ?

前回練習していなかった関数に

    • imtophat
    • imblackhat

なる関数どもがあります。こいつらは「周囲に対して相対的に」明るい部分を強調するのがトップハット、暗い部分を抜き出すのがブラックハットってことみたいです。処理例が以下に。

S = imread(fullpath(getIPCVpath() + "/images/morpex.png"));
se = imcreatese('ellipse',9,9);
STop = imtophat(S,se);
SBlack = imblackhat(S,se);
IBTop = imtophat(imB,se);
IBBlack = imblackhat(imB,se);
subplot(231); imshow(S);
subplot(232); imshow(STop);
subplot(233); imshow(SBlack);
subplot(234); imshow(imB);
subplot(235); imshow(IBTop);
subplot(236); imshow(IBBlack);

画像が以下に、左からオリジナル、中がトップハット、右がブラックハットです。上段の2値画像例だけ見ているとナンジャラホイという感じですが、下段のお猿様のご尊顔、とくに目のあたりを見ると、トップハット、ブラックハットの効果の違いが明らかではないかと。TOPHAT_BLACKHAT

imlabelとimblobprop

最後に手習ひしてみるのが以下の2関数です。

    • imlabel
    • imblobprop

お惚け老人が言葉で説明するより、処理例みていただく方が分かり易いかと。

まずはオリジナルのコイン画像(グレースケール)。coins

これを2値化した上に「膨張」処理したものが以下に。

coins_dilate

上記の2値画像を imlabelにかけて「塗分け」してもらうと以下のごとし。ぬりわけられている穴ぼこ(染み)をblobというみたい。imlabel

さらに、上記を imblobprop に食わせると、それぞれのblobの属性(位置)を求めてくれるみたいデス。こんな感じ。imblobprop

ちょっと最後の方はインテリジェンスが少し高くなったような、そうでもないような。。。

手習ひデジタル信号処理(140) Scilab、{IPCV}、モルフォロジー処理 へ戻る

手習ひデジタル信号処理(142) Scilab、{IPCV}、空間的な変換 へ進む