前回は画像フォーマット変換関数群とその「こまごま」を練習。今回は「モルフォロジー」Morphological Operationsです。ぶっちゃけ2値画像の変換処理デス。処理をしてみると「マスク」というか「ステンシルの型紙」を操作しているような感じです。ステンシルの型紙にペンを突っ込んでグリグリしている感じ?ホントか?
※2024年7月18日追記:本ページには修正点複数あり、そのあたりについてはお手数ですが次回をご参照ください。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
Morphological Operations
画像処理素人老人がゴタクを並べてもせんないので、英エディンバラ大様の以下のページなどご参照くだされ。今回手習ひしている関数どもの解説が見つかります(ScilabのHelpページにも「説明」はあるのだけれども素気なさすぎ。)
モルフォロジー処理自体は2値画像を(主な)対象に操作を行う関数多数。なのでお世話になるであろう変換関数が以下です。
im2bw
上記の関数により各種の画像フォーマットの画像を白黒2値の画像に変換することが可能です。
また、2値画像を「ステンシル・プレート」だとするとそこに突っ込むペン先にあたるものに Structure Element(構造要素と訳してよいのかな?)があります。その生成関数が 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);
グレースケール画像を反転しての操作です。
もっとステンシル風な奴ら
つづいて処理してみるのが以下です。すべて「構造要素(ステンシルのペン先)」的なものに大きく影響を受けるものどもです。関数毎の処理の違いとともに、構造要素の大きさも微妙に変えた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);
分かったような、分からぬような。。。