wi Octave での画像処理の例(二値画像を入力とする画像処理)

金子邦彦研究室プログラミングOctave の活用Octave での画像処理の例(二値画像を入力とする画像処理)

Octave での画像処理の例(二値画像を入力とする画像処理)

Octave での画像処理の例(二値画像を入力とする画像処理)の例を,プログラムと図解で説明する.

濃淡画像の場合は,別のページで説明している.
元画像 [image] [image]
濃淡画像 [image] [image]
二値画像 [image] [image]
距離画像 bwdist [image]
4隣接による境界抽出 bwborder [image] [image]
8隣接による境界抽出 bwborder( ,,,, 8) [image] [image]
接続領域の抽出 bwselect [image]
白領域の膨張 dilate [image] [image]
白領域の収縮 erode [image] [image]
open [image] [image]
close [image] [image]
tophat [image] [image]
bothat [image] [image]
bridge [image] [image]
clean [image] [image]
diag [image] [image]
fill [image] [image]
hbreak [image] [image]
majority [image] [image]
remove [image] [image]
shrink [image] [image]
skel [image]
skel-pratt [image]
spur [image] [image]
thicken [image] [image]
thin [image] [image]

前準備

Octave のインストール

必見 Web ページ: http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/

必見 Web ページ: http://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/

※ プロンプトを変えたいときは,次のように操作する.

PS1('> ')

※ Octave のインストールによっては,Octave の起動時に毎回次の操作を行う必要があるかもしれない

pkg load image

この Web ページに登場する画像データの種類

説明に使う二値画像  

■ Octave 3.2.4, Ubuntu の場合の実行例

fruits.jpg はOpenCV に同封のサンプル画像

curl -O https://www.kkaneko.jp/sample/lena_std.jpg
octave

[rgb, immap, alpha] = imread("/tmp/lena_std.jpg");
mono = rgb2gray( rgb );
bw = im2bw( mono, graythresh( mono ) );

[rgb2, immap2, alpha2] = imread("/usr/OpenCV-2.0.0/samples/c/fruits.jps");
mono2 = rgb2gray( rgb2 );
bw2 = im2bw( mono2, graythresh( mono2 ) );

map = gray(256);
colormap(map);
imshow(bw, [0 1]);
imshow(bw2, [0 1]);

[image]

Windows の場合の実行例

Windows では「imread("r:/lena_std.jpg");」のようになる. ImageMagick は使わない.

[rgb, immap, alpha] = imread("r:/lena_std.jpg");
mono = rgb2gray( rgb );
bw = im2bw(mono, graythresh( mono ) );
map = gray(256);
colormap(map);
imshow(bw, [0 1]);

[image]

[image]

Octave バージョン 3.2.4 で「warning: isstr is obsolete and will be removed from a future version of Octave, please use ischar instead」というエラーメッセージが出て,結局 plot での描画がうまくできないことがあります.

謝辞:http://www.tatsuromatsuoka.com/octave/jpn/OctaveWinMemo.html で公開されたいた「Octave for windows メモ」を参考にしました.ありがとうございます. プロットの前に,次の操作を行うことで,このエラーを回避できることがあります.


pkg unload oct2mat

double の配列を出力するもの

二値画像を出力するもの

4 隣接,8 隣接,接続領域

  1. 二値画像の 4 隣接による境界抽出 : bwborder

    4隣接画素のうち少なくとも1つが黒ならば境界であると判定する.

    imshow( bwborder( bw ) );
    

    [image]

    [image]
  2. 二値画像の 8 隣接による境界抽出 : bwperim( ..., 8)

    imshow( bwperim( bw, 8 ) );
    

    [image]

    [image]
  3. 接続領域 (connected region) の抽出 : bwselect

    座標値 i, j を指定し,(i, j) 画素と接続している領域を抽出する.

    imshow( bwselect( bw, 400, 400 ) );
    

    [image]

    [image]
  4. 二値画像の構造要素とのマッチング : bwhitmiss
  5. 二値画像の画素上 (on) にある領域の推定 : bwarea

    imshow( bwarea( bw ) );
    

    二値画像のモルフォロジカル演算 : bwmorph

    関連する外部ページ】: http://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm

    1. "dilate" : dilation operation

      白領域の膨張

      imshow( bwmorph( bw, "dilate", 6 ) );
      

      [image]

      [image]
    2. "erode" : erosion operation

      白領域の収縮 (dilation の逆)

      imshow( bwmorph( bw, "erode", 6 );
      

      [image]

      [image]
    3. "open" : opening operation

      erosion の後 dilation.小さな白領域が除去される.Octave では,パラメータ数は 2 個である ( 3 個は NG である ) ことに注意

      imshow( bwmorph( bw, "open" );
      

      [image]

      [image]
    4. "close" : close operation

      dilation の後 erosion.小さな黒領域が除去される.Octave では,opening と同じく,パラメータ数は 2 個である ( 3 個は NG である ) ことに注意

      imshow( bwmorph( bw, "close" );
      

      [image]
    5. "tophat" : tophat operation

      元画像からの opening 結果の減算(つまり,opening により除去された画像)

      imshow( bwmorph( bw, "tophat" );
      

      [image]

      [image]
    6. "bothat" : bottom hat operation

      closing 結果からの元画像の減算(つまり,closing により増えた画素)

      imshow( bwmorph( bw, "bothat" );
      

      [image]

      [image]
    7. "bridge" : bridge operation

      ブリッジ.隣接画素 (neighbours) のうち接続していない 2つ以上の画素が「1」のとき,画素値を「0」にセットする

      imshow( bwmorph( bw, "bridge" );
      

      [image]

      [image]
    8. "clean" : clean operation

      8隣接画素 (eight-connected neighbours) の全てが「0」のとき,画素値を「0」にセットする.孤立した「1」の画素が除去される.

      imshow( bwmorph( bw, "clean" );
      

      [image]

      [image]
    9. "diag" : diagonal fill operation

      背景の 8隣接性を除去するように,画素値を「1」にセットする.

      imshow( bwmorph( bw, "diag" );
      

      [image]

      [image]
    10. "fill" : integior fill operation

      4隣接画素 (four-connected neighbours) の全てが「1」のとき,画素値を「1」にセットする.孤立した「0」の画素が「1」になる.

      imshow( bwmorph( bw, "fill" );
      

      [image]

      [image]
    11. "hbreak" : H-break operation

      H-connected である画素を「0」にセットする.

      [image]

      [image]
    12. "majority" : majority black operation

      3x3 ウインドウ内の 5 個以上の画素が「1」であるとき,画素値を「1」にセットする

      [image]

      [image]
    13. "remove" : iterior pixel remove operation

      4隣接画素 (four-connected neighbours) の全てが「1」のとき,画素値を「0」にセットする.つまり,4隣接画素のうち少なくとも1つが黒ならば境界であると判定する.

      ※ bwborder と同じ.

      [image]

      [image]
    14. "shrink" : shrink operation

      細線化

      imshow( bwmorph( bw, "shrink", 6 ) );
      

      [image]

      [image]
    15. "skel" : skeltonization

      「median axis skeleton」によるスケルトン化

      imshow( bwmorph( bw, "skel", 6 ) );
      

      [image]

      [image]
    16. "skel-pratt" : skeltonization

      William K. Pratt の方法によるスケルトン化

      imshow( bwmorph( bw, "skel-pratt", 6 ) );
      

      [image]
    17. "spur" : remove spur operation

      隣接画素の中に eight-connected であるような画素が 1 つだけあるとき,画素値を「0」にセットする.

      imshow( bwmorph( bw, "spur", 6 ) );
      

      [image]

      [image]
    18. "thicken" : thickening operation

      背景画素の細線化

      imshow( bwmorph( bw, "thicken", 6 ) );
      

      [image]

      [image]
    19. "thin" : thinning operation

      細線化

      imshow( bwmorph( bw, "thin", 6 ) );
      

      [image]

      [image]