◆ このWeb ページで行うこと
※ 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
◆ 設定例
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
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 プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); graythresh( mono )
しきい値を指定して二値化する.しきい値を求めるには,graythreash を使うのが便利.
■ 濃淡画像の二値化を行う Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); bw = im2bw( mono, graythresh( mono ) ); imshow(bw, [0 1]);
◆ 実行結果の例
エッジ抽出 には Octave の edge 関数を使う。
■ エッジ抽出を行う Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); bw = edge( mono, "Sobel" ); imshow(bw, [0 1]);
bw = edge( mono, "Sobel" );
◆ 実行結果の例
bw = edge( mono, "Prewitt" );
◆ 実行結果の例
bw = edge( mono, "Roberts" );
◆ 実行結果の例
bw = edge( mono, "Kirsch" );
◆ 実行結果の例
bw = edge( mono, "LoG" );
◆ 実行結果の例
bw = edge( mono, "Canny" );
◆ 実行結果の例
bw = edge( mono, "Lindeberg" );
◆ 実行結果の例
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) ) )