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