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

Joseph Halfmoon

前回は画像フォーマット変換関数群とその「こまごま」を練習。今回は「モルフォロジー」Morphological Operationsです。ぶっちゃけ2値画像の変換処理デス。処理をしてみると「マスク」というか「ステンシルの型紙」を操作しているような感じです。ステンシルの型紙にペンを突っ込んでグリグリしている感じ?ホントか?

※2024年7月18日追記:本ページには修正点複数あり、そのあたりについてはお手数ですが次回をご参照ください。

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

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

Morphological Operations

画像処理素人老人がゴタクを並べてもせんないので、英エディンバラ大様の以下のページなどご参照くだされ。今回手習ひしている関数どもの解説が見つかります(ScilabのHelpページにも「説明」はあるのだけれども素気なさすぎ。)

Morphology

モルフォロジー処理自体は2値画像を(主な)対象に操作を行う関数多数。なのでお世話になるであろう変換関数が以下です。

im2bw

上記の関数により各種の画像フォーマットの画像を白黒2値の画像に変換することが可能です。

また、2値画像を「ステンシル・プレート」だとするとそこに突っ込むペン先にあたるものに Structure Element(構造要素と訳してよいのかな?)があります。その生成関数が imcreatese 関数です。以下は imcreatese関数を使って「構造要素」を作ってみたところ。imcreatese

 

「ふで先」の形が、rect、ellipse、crossの3種類から選べます。そしてサイズ(行、列の順)を与えます。

「穴埋め」、「膨張」、「収縮」

まず練習してみるのが以下の3つの関数です。

    • imfill
    • imdilate
    • imerode

上記をテストするためのコードが以下に。

C = imread(fullpath(getIPCVpath() + "/images/" + 'coins_gray.jpg'));
subplot(151);imshow(C);
Cbin = im2bw(~C,0.5);
subplot(152);imshow(Cbin);
Cfill = imfill(Cbin);
subplot(153);imshow(Cfill);
se3 = imcreatese('rect',3,3);
Cdilate = imdilate(Cbin, se3);
subplot(154);imshow(Cdilate);
Cerode = imerode(Cbin, se3);
subplot(155);imshow(Cerode);

生成した画像にコメントを加えたものが以下に。MorphologicalFuncs

グレースケール画像を反転しての操作です。

もっとステンシル風な奴ら

つづいて処理してみるのが以下です。すべて「構造要素(ステンシルのペン先)」的なものに大きく影響を受けるものどもです。関数毎の処理の違いとともに、構造要素の大きさも微妙に変えた2種類を練習。

    • imgradient
    • imhitmiss
    • imopen
    • imclose

手習ひコードが以下に。

S = imread(fullpath(getIPCVpath() + "/images/morpex.png"));
subplot(251); imshow(S);
se5 = imcreatese('rect',5,5);
se7 = imcreatese('rect',7,7);

Sopen5 = imopen(S, se5);
subplot(252); imshow(Sopen5);
Sclose5 = imclose(S, se5);
subplot(253); imshow(Sclose5);
Shitmiss5 = imhitmiss(S, se5);
subplot(254); imshow(Shitmiss5);
Sgradient5 = imgradient(S, se5);
subplot(255); imshow(Sgradient5);

Sopen7 = imopen(S, se7);
subplot(257); imshow(Sopen7);
Sclose7 = imclose(S, se7);
subplot(258); imshow(Sclose7);
Shitmiss7 = imhitmiss(S, se7);
subplot(259); imshow(Shitmiss7);
Sgradient7 = imgradient(S, se7);
subplot(2,5,10); imshow(Sgradient7);

その結果が以下に。MorphologicalOpsEC

分かったような、分からぬような。。。

手習ひデジタル信号処理(139) Scilab、{IPCV}、変換関数群とその使用のこまごま へ戻る

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