金子邦彦研究室プログラミングOctave の活用Octave で濃淡画像の二値化、エッジ抽出(濃淡画像を入力、二値画像を出力とする)

Octave で濃淡画像の二値化、エッジ抽出(濃淡画像を入力、二値画像を出力とする)

Octave で濃淡画像の二値化、エッジ抽出を説明する.

◆ このWeb ページで行うこと

Octave での画像ファイルの入出力については,別のページで説明している.

前準備

Octave のインストール

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

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

説明に使う濃淡画像  

この Web ページの手順をそのままなぞる場合には, 下記の手順で画像ファイルのダウンロードと確認を行う.

  1. 画像ファイルのダウンロード

    ◆ 使用する画像ファイルのダウンロード手順例

    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
    
  2. (オプション) MatlabFns を入手し、分かりやすいディレクトリ(例えば /usr/local/MatlabFns)に展開
  3. (オプション) 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");
    
  4. Octave の起動
    octave
    
  5. 確認のため,表示してみる。

    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]);
    
元画像 [image] [image]
濃淡画像 [image] [image] [image] [image]

◆ Ubuntu 11.10 での実行結果例

[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

Octave で濃淡画像の Thresholding と二値化

Octave で濃淡画像のエッジ抽出

エッジ抽出 には Octave の edge 関数を使う。

エッジ抽出を行う Octave プログラム例

rgb = imread("/tmp/lena_std.jpg");
mono = rgb2gray( rgb );
bw = edge( mono, "Sobel" );
imshow(bw, [0 1]);
■ プログラム例

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

[image]
  • ラブラシアンフィルタを用いたエッジ抽出

    ラブラシアンフィルタの生成は fspecial 関数を使って簡単にできる.

    alpha = 0.2
    f = fspecial("laplacian", alpha);
    surfl(f);
    

    [image]

    [image]

    ラブラシアンフィルタの適用

    mono3 = imfilter( double(mono), f, "same" );
    mono4 = ( mono3 - min(min(mono3)) ) / ( max(max(mono3)) - min(min(mono3)) );
    imshow(mono4)
    

    [image]

    2値化して表示

    bw = im2bw( mono4, graythresh(mono4) ) )
    

    [image]