金子邦彦研究室プログラミング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
    curl -O https://www.kkaneko.jp/sample/test.bmp
    
  2. Octave の起動
    octave
    
  3. 確認のため,表示してみる。

    画像ファイルを変数 に読み込み表示

    Windows では「imread("r:/lena_std.jpg");」のようになる.

    rgb = imread("/tmp/lena_std.jpg");
    rgb2 = imread("/tmp/fruits.jpg");
    rgb3 = imread("/tmp/test.bmp");
    
    colormap(gray(256));
    imshow(rgb);
    imshow(rgb2);
    imshow(rgb3 * 255);
    
元画像 [image] [image] [image]

Octave で勾配強度画像を生成する

勾配強度画像

事前準備

http://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/ で,「Util」をクリック. 「Lab2RGB.m」と 「RGB2Lab.m」をダウンロード.わかりやすいディレクトリに置いておく.

勾配強度画像を表示する Octave プログラム例

勾配強度は gradient を使って求める. imadjust を使い,最小値が黒、最大値が白になるように調整して表示.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[Dx, Dy] = gradient(double(rgb));
D = sqrt( Dx .* Dx + Dy .* Dy );
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image] [image] [image]

横方向の勾配

横方向の勾配を表示する Octave プログラム例

横方向の勾配は gradient を使って求める(Dx に入る). imadjust を使い,最小値が黒、最大値が白になるように調整して表示.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[Dx, Dy] = gradient(double(rgb));
D = abs(Dx); 
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image] [image] [image]

縦方向の勾配

縦方向の勾配を表示する Octave プログラム例

縦方向の勾配は gradient を使って求める(Dy に入る). imadjust を使い,最小値が黒、最大値が白になるように調整して表示.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[Dx, Dy] = gradient(double(rgb));
D = abs(Dy); 
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image] [image]

ガウシアン平滑化 (Isotropic Gaussian Smoothing)

事前準備

http://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/ で,「Util」をクリック. 「Lab2RGB.m」と 「RGB2Lab.m」をダウンロード.わかりやすいディレクトリに置いておく.

ガウシアン平滑化を行う Octave プログラム (Octave program for Isotropic Gaussian Smoothing)

「"Bilateral"」は ガウシアン平滑化 「sigma = 6)」の部分は調整してください

※ Octave 3.6.1, Ubuntu 11.10 で動作確認済み.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");
[lab(:,:,1), lab(:,:,2), lab(:,:,3)] = RGB2Lab(rgb);
flab = imsmooth(lab, "Gaussian", sigma = 6); 
frgb = Lab2RGB( flab(:,:,1), flab(:,:,2), flab(:,:,3) );
colormap(gray(256));
imshow(rgb2);

◆ 実行結果の例

[image] [image]

Octave でガウシアンフィルタと勾配強度の組み合わせ

ガウシアンフィルタと勾配強度の組み合わせ

ガウシアンフィルタを適用した後で,勾配強度を求める(勾配強度の値を正規化して表示)

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[lab(:,:,1), lab(:,:,2), lab(:,:,3)] = RGB2Lab(rgb);
flab = imsmooth(lab, "Gaussian", sigma = 6); 
frgb = Lab2RGB( flab(:,:,1), flab(:,:,2), flab(:,:,3) );

[Dx, Dy] = gradient(double(frgb));
D = sqrt( Dx .* Dx + Dy .* Dy );
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image] [image]

ガウシアンフィルタと横方向の勾配の組み合わせ

横方向の勾配を表示する Octave プログラム例

ガウシアンフィルタを適用した後で,横方向の勾配(求まった勾配値を正規化して表示)

横方向の勾配は gradient を使って求める(Dx に入る). imadjust を使い,最小値が黒、最大値が白になるように調整して表示.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[lab(:,:,1), lab(:,:,2), lab(:,:,3)] = RGB2Lab(rgb);
flab = imsmooth(lab, "Gaussian", sigma = 6); 
frgb = Lab2RGB( flab(:,:,1), flab(:,:,2), flab(:,:,3) );

[Dx, Dy] = gradient(double(frgb));
D = abs(Dx); 
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image] [image]

ガウシアンフィルタと横方向の勾配の組み合わせ

縦方向の勾配を表示する Octave プログラム例

ガウシアンフィルタを適用した後で,縦方向の勾配(求まった勾配値を正規化して表示)

縦方向の勾配は gradient を使って求める(Dx に入る). imadjust を使い,最小値が黒、最大値が白になるように調整して表示.

source "RGB2Lab.m"
source "Lab2RGB.m"
rgb = imread("/tmp/lena_std.jpg");

[lab(:,:,1), lab(:,:,2), lab(:,:,3)] = RGB2Lab(rgb);
flab = imsmooth(lab, "Gaussian", sigma = 6); 
frgb = Lab2RGB( flab(:,:,1), flab(:,:,2), flab(:,:,3) );

[Dx, Dy] = gradient(double(frgb));
D = abs(Dy); 
DD = imadjust(D, [min(min(D(:,:,1))) min(min(D(:,:,2))) min(min(D(:,:,3))); max(max(D(:,:,1))) max(max(D(:,:,2))) max(max(D(:,:,3)))]);
colormap(gray(256));
imshow( DD );

◆ 実行結果の例

[image]