Octave で濃淡画像の二値化、エッジ抽出(濃淡画像を入力、二値画像を出力とする)
◆ このWeb ページで行うこと
- 濃淡画像の Thresholding と二値化
- 濃淡画像の エッジ抽出
* Octave での画像ファイルの入出力については,別のページで説明している.
前準備
Octave のインストール
必見 Web ページ: http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/
必見 Web ページ: http://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/
説明に使う濃淡画像
この Web ページの手順をそのままなぞる場合には, 下記の手順で画像ファイルのダウンロードと確認を行う.
- 画像ファイルのダウンロード
◆ 使用する画像ファイルのダウンロード手順例
cd /tmp curl -O https://www.kkaneko.jp/sample/lena_std.jpg curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg
- (オプション) MatlabFns を入手し、分かりやすいディレクトリ(例えば /usr/local/MatlabFns)に展開
- (オプション) MatlabFns を使うように .octaverc を設定する
◆ 設定例
setenv("CFLAGS", "-D__STDC_CONSTANT_MACROS"); setenv("CXXFLAGS", "-D__STDC_CONSTANT_MACROS"); addpath ("/usr/local/MatlabFns/FingerPrints"); addpath ("/usr/local/MatlabFns/FrequencyFilt"); addpath ("/usr/local/MatlabFns/GreyTrans"); addpath ("/usr/local/MatlabFns/LineSegments"); addpath ("/usr/local/MatlabFns/Match"); addpath ("/usr/local/MatlabFns/Misc"); addpath ("/usr/local/MatlabFns/PhaseCongruency"); addpath ("/usr/local/MatlabFns/Projective"); addpath ("/usr/local/MatlabFns/Robust"); addpath ("/usr/local/MatlabFns/Rotations"); addpath ("/usr/local/MatlabFns/Shapelet"); addpath ("/usr/local/MatlabFns/Spatial"); addpath ("/usr/local/share/octave/mex");
- Octave の起動
octave
- 確認のため,表示してみる。
MatlabFns を使わないときは mono3, mono4 を含む行(下記では太字)を無視すること
* Windows では「imread("r:/lena_std.jpg");」のようになる.
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); rgb2 = imread("/tmp/fruits.jpg"); mono2 = rgb2gray( rgb2 ); mono3 = uint8( step2line(100, -1) * 255 ); mono4 = uint8( starsine( sze = 256, wavelength = 8, nScales = 1, ampExponent = 3 ) * 255 ); colormap(gray(256)); imshow(mono); imshow(mono2); imshow(mono3, [0 1]); imshow(mono4, [0 1]);
元画像 |
![]() |
![]() |
||
濃淡画像 |
![]() |
![]() |
![]() |
![]() |
◆ Ubuntu 11.10 での実行結果例


* 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
Octave で濃淡画像の Thresholding と二値化
- 濃淡画像のしきい値 : graythresh
* しきい値を求める Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); graythresh( mono )
- 濃淡画像の二値化 : im2bw
しきい値を指定して二値化する.しきい値を求めるには,graythreash を使うのが便利.
* 濃淡画像の二値化を行う Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); bw = im2bw( mono, graythresh( mono ) ); imshow(bw, [0 1]);
◆ 実行結果の例
Octave で濃淡画像のエッジ抽出
エッジ抽出 には Octave の edge 関数を使う。
* エッジ抽出を行う Octave プログラム例
rgb = imread("/tmp/lena_std.jpg");
mono = rgb2gray( rgb );
bw = edge( mono, "Sobel" );
imshow(bw, [0 1]);
- "Soble"
bw = edge( mono, "Sobel" );
◆ 実行結果の例
- "Prewitt"
bw = edge( mono, "Prewitt" );
◆ 実行結果の例
- "Roberts"
bw = edge( mono, "Roberts" );
◆ 実行結果の例
- "Kirsch"
bw = edge( mono, "Kirsch" );
◆ 実行結果の例
- "LoG"
bw = edge( mono, "LoG" );
◆ 実行結果の例
- "Canny"
bw = edge( mono, "Canny" );
◆ 実行結果の例
- "Lindeberg"
bw = edge( mono, "Lindeberg" );
◆ 実行結果の例
- "Andy"
bw = edge( mono, "Andy" );
◆ 実行結果の例
function e = myedge(mono, s, th)
# エッジ画像を求める関数
# mono 濃淡画像
# s ガウシアンフィルタの引数
# th 閾値 0 から 1 の値
im = edge( mono, "Sobel" ) + edge( mono, "Prewitt" ) + edge( mono, "Roberts" ) + edge( mono, "Kirsch" ) + edge( mono, "LoG" ) + edge( mono, "Canny" ) + edge( mono, "Lindeberg" );
# ガウシアンフィルタ
f = fspecial("gaussian", s*5, s);
im2 = filter2( f, im, "same" );
# 0 から 1 に正規化
MI = min(min(im2));
MA = max(max(im2));
T = MI + ( th * (MA - MI) );
e = im2 > T;
endfunction
[rgb, immap, alpha] = imread("/tmp/lena_std.jpg");
mono = rgb2gray( rgb );
colormap(gray(256));
bw = myedge(mono, 1, 0.3) );

ラブラシアンフィルタの生成は fspecial 関数を使って簡単にできる.
alpha = 0.2
f = fspecial("laplacian", alpha);
surfl(f);


ラブラシアンフィルタの適用
mono3 = imfilter( double(mono), f, "same" );
mono4 = ( mono3 - min(min(mono3)) ) / ( max(max(mono3)) - min(min(mono3)) );
imshow(mono4)

2値化して表示
bw = im2bw( mono4, graythresh(mono4) ) )
