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 ページの手順をそのままなぞる場合には, 下記の手順で画像ファイルのダウンロードと確認を行う.
- 画像ファイルのダウンロード
◆ 使用する画像ファイルのダウンロード手順例
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 で濃淡画像のヒストグラムとヒストグラム平坦化
- 画像ヒストグラム (image histogram) : imhist
* 画像から輝度ヒストグラムを作成する Octave プログラム例
imhist( double(mono), 256 );
◆ 実行結果の例
- ヒストグラム平滑化 (image equalization) : histeq
* 輝度ヒストグラムの平滑化を行う Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); r = histeq( double(mono) );
◆ 実行結果の例
念のため、輝度ヒストグラムの平滑化を行ったあとの画像についてヒストグラムを表示させてみる.
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); MA = double( max(max(mono)) ); imhist( histeq( double(mono)/MA ) );
種々の処理
- 局所エントロピー (local entropy) : entropyfilt
* Octave プログラム例
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); r = entropyfilt( mono ) );
◆ 実行結果の例
- フィルタの生成 : fspecial
- フィルタの実行 : imfilter
- 輝度調整 : imadjust
- 変換テーブルによる変形 : imremap
- サイズの変更 : imresize
例: mono は画像,0.5 は倍率.'cubic' については「help interp2」
bw = imresize( mono, 0.5, 'cubic' ) );
- メディアン : medfilt2
- 2次元 Radon 変換 : radon
- 局所標準偏差 (local standard deviation in a neighbourhood) : stdfilt
- モルフォロジー演算群
- ポリゴンからのマスク画像の生成 : poly2mask
- 二値画像の反転 : imcomplement
- 二値画像のハフ変換 : hough_circle
- 二値画像のハフ変換 : hough_line
- 二値画像のハフ変換 : houghtf
- 画像の極大値 : immaximas
以下、書きかけ
Octave の次の関数を使う.
- imread: 画像ファイルの読み込み
- imshow: 画像の表示
- surfl: 行列を高さをもった曲面として表示 ・・・ フィルタの確認に便利
- fspecial: フィルタの生成
- imfilter: 画像フィルタの適用
- filter2: FIR フィルタの適用
- gradient: 勾配
ガウシアンフィルタの生成
- ガウシアンフィルタの生成
s = 5; f = fspecial("gaussian", s * 5, s); surfl( f );
- ガウシアンフィルタの適用(値を正規化して表示)
mono2 = imfilter(double(mono), f, "same"); imshow( mono2, [min(min(mono2)) max(max(mono2))])
* colormap がおかしいときは,「map = gray(256); colormap(map);」を実行してください.
to be written. log, unsharp, motion, sobel, kirsch,




プログラムのソースコード(書きかけ)
rgb = imread("/tmp/lena_std.jpg"); mono = rgb2gray( rgb ); colormap(gray(256)); # ガウシアンフィルタ s = 5; f = fspecial("gaussian", s * 5, s); surfl( f ); gray2 = filter2( f, mono, "same" ); colormap(map); imagesc( mono ); w = input("please press Enter to proceed"); imagesc( gray2 ); w = input("please press Enter to proceed"); [Dx, Dy] = gradient(double(mono)); imagesc( Dx ); w = input("please press Enter to proceed"); imagesc( Dy ); w = input("please press Enter to proceed"); [Dx, Dy] = gradient(double(gray2)); imagesc( Dx ); w = input("please press Enter to proceed"); imagesc( Dy ); w = input("please press Enter to proceed");