Octave での画像処理の例(二値画像を入力とする画像処理)
Octave での画像処理の例(二値画像を入力とする画像処理)の例を,プログラムと図解で説明する.
- 距離変換
- 境界抽出
- 接続領域 (connected region) の抽出
- モルフォロジカル演算
* 濃淡画像の場合は,別のページで説明している.
前準備
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 ページに登場する画像データの種類
- カラー画像 (color) の場合: M x N x 3 の配列
- 濃淡画像 (grey-level) の場合: M x N の配列
- 二値画像 (black-and-white) の場合: M x N の配列
説明に使う二値画像
* 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]);

* 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]);


* 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 の配列を出力するもの
- 二値画像の距離変換 (distance transform) : bwdist
入力の二値画像を「0 は背景,1 はオブジェクト」とみなし,個々の背景画素ごとにオブジェクトからの最短距離を求める.オブジェクト画素での値は 0 になる.
d = bwdist( bw ); imshow(d, [min(min(d)) max(max(d))]);
二値画像を出力するもの
4 隣接,8 隣接,接続領域
- 二値画像の 4 隣接による境界抽出 : bwborder
4隣接画素のうち少なくとも1つが黒ならば境界であると判定する.
imshow( bwborder( bw ) );
- 二値画像の 8 隣接による境界抽出 : bwperim( ..., 8)
imshow( bwperim( bw, 8 ) );
- 接続領域 (connected region) の抽出 : bwselect
座標値 i, j を指定し,(i, j) 画素と接続している領域を抽出する.
imshow( bwselect( bw, 400, 400 ) );
- 二値画像の構造要素とのマッチング : bwhitmiss
- 二値画像の画素上 (on) にある領域の推定 : bwarea
imshow( bwarea( bw ) );
二値画像のモルフォロジカル演算 : bwmorph
【関連する外部ページ】: http://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm
- "dilate" : dilation operation
白領域の膨張
imshow( bwmorph( bw, "dilate", 6 ) );
- "erode" : erosion operation
白領域の収縮 (dilation の逆)
imshow( bwmorph( bw, "erode", 6 );
- "open" : opening operation
erosion の後 dilation.小さな白領域が除去される.Octave では,パラメータ数は 2 個である ( 3 個は NG である ) ことに注意
imshow( bwmorph( bw, "open" );
- "close" : close operation
dilation の後 erosion.小さな黒領域が除去される.Octave では,opening と同じく,パラメータ数は 2 個である ( 3 個は NG である ) ことに注意
imshow( bwmorph( bw, "close" );
- "tophat" : tophat operation
元画像からの opening 結果の減算(つまり,opening により除去された画像)
imshow( bwmorph( bw, "tophat" );
- "bothat" : bottom hat operation
closing 結果からの元画像の減算(つまり,closing により増えた画素)
imshow( bwmorph( bw, "bothat" );
- "bridge" : bridge operation
ブリッジ.隣接画素 (neighbours) のうち接続していない 2つ以上の画素が「1」のとき,画素値を「0」にセットする
imshow( bwmorph( bw, "bridge" );
- "clean" : clean operation
8隣接画素 (eight-connected neighbours) の全てが「0」のとき,画素値を「0」にセットする.孤立した「1」の画素が除去される.
imshow( bwmorph( bw, "clean" );
- "diag" : diagonal fill operation
背景の 8隣接性を除去するように,画素値を「1」にセットする.
imshow( bwmorph( bw, "diag" );
- "fill" : integior fill operation
4隣接画素 (four-connected neighbours) の全てが「1」のとき,画素値を「1」にセットする.孤立した「0」の画素が「1」になる.
imshow( bwmorph( bw, "fill" );
- "hbreak" : H-break operation
H-connected である画素を「0」にセットする.
- "majority" : majority black operation
3x3 ウインドウ内の 5 個以上の画素が「1」であるとき,画素値を「1」にセットする
- "remove" : iterior pixel remove operation
4隣接画素 (four-connected neighbours) の全てが「1」のとき,画素値を「0」にセットする.つまり,4隣接画素のうち少なくとも1つが黒ならば境界であると判定する.
* bwborder と同じ.
- "shrink" : shrink operation
細線化
imshow( bwmorph( bw, "shrink", 6 ) );
- "skel" : skeltonization
「median axis skeleton」によるスケルトン化
imshow( bwmorph( bw, "skel", 6 ) );
- "skel-pratt" : skeltonization
William K. Pratt の方法によるスケルトン化
imshow( bwmorph( bw, "skel-pratt", 6 ) );
- "spur" : remove spur operation
隣接画素の中に eight-connected であるような画素が 1 つだけあるとき,画素値を「0」にセットする.
imshow( bwmorph( bw, "spur", 6 ) );
- "thicken" : thickening operation
背景画素の細線化
imshow( bwmorph( bw, "thicken", 6 ) );
- "thin" : thinning operation
細線化
imshow( bwmorph( bw, "thin", 6 ) );