62
大分大学工学部福祉環境工学科尾研究室 資料 Ver.6 1/14/2003 1 MATLAB 画像処理 1.画像表示関数 関数 使用例 取り扱う画像データの種類 imagesc imagesc imagesc imagesc imagesc imagesc imagesc imagesc(X);colormap(gray); (X);colormap(gray); (X);colormap(gray); (X);colormap(gray); imagesc(X,[a b]);colormap(gray); imagesc(X,[a b]);colormap(gray); imagesc(X,[a b]);colormap(gray); imagesc(X,[a b]);colormap(gray); 強度画像(輝度だけの画像で,データの値の 範囲は任意).色調名は,通常,線形スケーリ ングの gray gray gray gray.sc はスケーリングの意味で,画像 データの数値をスケーリングして,値を 輝度(白),小値をゼロ輝度(黒)で表示す る.colormap colormap colormap colormap コマンドは,強度画像データに色 調を与える. image image image image image(X);colormap(map); image(X);colormap(map); image(X);colormap(map); image(X);colormap(map); カラーマップつき画像.カラーマップ map はデ ータに付属. image image image image image(X); image(X); image(X); image(X); RGB 画像(uint8 データでは[0,255],double デ ータでは[0,1]) ●強度画像(Intensity Image) 画像データは配列であるが,2次元配列1つだけでは,色情報を表せず,明るさの明のみから なるモノトーン画像のみが表現できる.これを強度画像という.たとえば,つぎのようにする. X = zeros(256,256); X = zeros(256,256); X = zeros(256,256); X = zeros(256,256); %256 %256 %256 %256×256 256 256 256 ピクセ ピクセ ピクセ ピクセル for k=1:256 for k=1:256 for k=1:256 for k=1:256 X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k-128)/64); 128)/64); 128)/64); 128)/64); end end end end imagesc(X);colormap(gray);colorbar; imagesc(X);colormap(gray);colorbar; imagesc(X);colormap(gray);colorbar; imagesc(X);colormap(gray);colorbar; これを実行すると,つぎのような画像が得られる.

大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

1

MATLAB 画像処理

1.画像表示関数

関数 使用例 取り扱う画像データの種類

imagescimagescimagescimagesc imagescimagescimagescimagesc(X);colormap(gray);(X);colormap(gray);(X);colormap(gray);(X);colormap(gray);

imagesc(X,[a b]);colormap(gray);imagesc(X,[a b]);colormap(gray);imagesc(X,[a b]);colormap(gray);imagesc(X,[a b]);colormap(gray);

強度画像(輝度だけの画像で,データの値の

範囲は任意).色調名は,通常,線形スケーリ

ングの graygraygraygray.sc はスケーリングの意味で,画像

データの数値をスケーリングして,最大値を最

大輝度(白),最小値をゼロ輝度(黒)で表示す

る.colormapcolormapcolormapcolormap コマンドは,強度画像データに色

調を与える.

imageimageimageimage image(X);colormap(map);image(X);colormap(map);image(X);colormap(map);image(X);colormap(map); カラーマップつき画像.カラーマップ map はデ

ータに付属.

imageimageimageimage image(X);image(X);image(X);image(X); RGB 画像(uint8 データでは[0,255],double デ

ータでは[0,1])

強度画像(Intensity Image)

画像データは配列であるが,2次元配列1つだけでは,色情報を表せず,明るさの明暗のみから

なるモノトーン画像のみが表現できる.これを強度画像という.たとえば,つぎのようにする.

X = zeros(256,256);X = zeros(256,256);X = zeros(256,256);X = zeros(256,256); %256 %256 %256 %256××××256256256256 ピクセピクセピクセピクセルルルル

for k=1:256for k=1:256for k=1:256for k=1:256

X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k X(:,k) = cos(2*pi*(k----128)/64);128)/64);128)/64);128)/64);

endendendend

imagesc(X);colormap(gray);colorbar;imagesc(X);colormap(gray);colorbar;imagesc(X);colormap(gray);colorbar;imagesc(X);colormap(gray);colorbar;

これを実行すると,つぎのような画像が得られる.

Page 2: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

2

カラーマップつき画像(Indexed Image)

カラーマップつき画像は画像データ配列とそのカラー情報であるカラーマップ配列との組で構成

されている.

RGB 画像(RGB Image)

RGB 画像(トゥルーカラー画像)データは R,G,B の3つの2次元配列から構成される.データは

X(:,:,k)の3次元配列であり,k=1 が R(Red),k=2が G(Green),k=3が B(Blue)を与える.

colormap(map)colormap(map)colormap(map)colormap(map)で指定する色調(色合い)パラメータ

mapmapmapmap(色調名) 特徴

graygraygraygray 線形のグレースケール

bonebonebonebone 青みを加えたグレースケール

coppercoppercoppercopper 黒から明銅色へ変化

pinkpinkpinkpink ピンクのセピア調

coolcoolcoolcool シアンからマジェンタへ変化

hothothothot 黒から暗い赤,オレンジ,黄色,白へ変化

springspringspringspring マジェンタと黄色の色調

susususummermmermmermmer 緑と黄色の色調

autumnautumnautumnautumn 赤からオレンジ,黄色へと変化

winterwinterwinterwinter 青と緑の色調

jetjetjetjet 青からシアン,黄,オレンジ,赤へと変化

hsvhsvhsvhsv 赤から黄,緑,シアン,青,マジェンタから赤へ戻る

colorcubecolorcubecolorcubecolorcube グレー,赤,緑,青へと変化

flagflagflagflag 赤,白,青,黒への変化

prismprismprismprism 赤,オレンジ,黄,緑,青,紫の6色の繰り返し

‘‘‘‘defaultdefaultdefaultdefault’’’’ デフォルトは jetjetjetjet

colormapcolormapcolormapcolormap は,64×3の行列で,各列は左から順に R(赤),G(緑),B(青)に関する3色の輝度(色

の明るさの度合)を意味している.また,上から順に,データの値の最小値に1行目の要素の三成

分,64行目に最大値が指定されている.要素の最大値は[0,1]の区間の値で,0 が輝度ゼロで,1

が最大輝度である.これは,コマンドウィンドウで,たとえば,つぎのようにすれば表示される.

>> graygraygraygray

2 値画像(Binary Image)

各データが0か1のどちからのモノクロ画像.

2.カラー画像データの取り込み(inport)方法

外部データを MATLAB ワークスペースに取り込む最も簡単な方法は,MATLAB のメニュー:ファファファファ

イルイルイルイルで,データデータデータデータののののインポートインポートインポートインポートを選択することである.これで,ファイルを選択するとインポートウィザー

Page 3: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

3

ドが起動され,自動的に MATLAB の内部データとして取り込むことができる.インポートで取り込め

るデータ(画像以外にも音声,動画,Excel シートも可能)は下記のとおりである.

gif,cur(Cursor フォーマット),hdf(Hierarchical Data Format),ico,jpg,jpeg,avi(動画),png(Portable

Network Graphics), au(音声),snd(音声),wav(音声),csv,xls,wkl(Spread sheet), tif,tiff(Tagged Image

File Format), bmp(bitmap), pcx(ペイントブラシ)

下記に,ファイル名 exp.gifを取り込んだときのインポートウィザードを示す.

Page 4: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

4

これにより,MATLABワークスペースにファイル名と同じ変数名でインポートされ,この

データは構造体になっていることがわかる.

>> exp>> exp>> exp>> exp

exp = exp = exp = exp =

cdata: [128x128 uint8] cdata: [128x128 uint8] cdata: [128x128 uint8] cdata: [128x128 uint8]

colormap: [256x3 double]colormap: [256x3 double]colormap: [256x3 double]colormap: [256x3 double]

これから,exp.cdataは 128×128の uinit8データ(符号なし 8ビット整数データ,0から

255 までの整数値)であり,exp.colormap は 256×3 の double(倍精度実数値)であるこ

とがわかる.これらの値にアクセスするには,メンバー名まで指定して,つぎのようにす

る.

>> exp.cdata>> exp.cdata>> exp.cdata>> exp.cdata

さらに,MATLAB関数でつぎのようなものが用意されている.

関数 用例

imreadimreadimreadimread (1) 画像ファイルからデータを読み込む場合

自動でファイル形式を判定する場合

X = imread(X = imread(X = imread(X = imread(‘‘‘‘filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’))))

ファイル形式を指定する場合

X = imread(X = imread(X = imread(X = imread(‘‘‘‘filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’,,,,’’’’fileformatfileformatfileformatfileformat’’’’))))

・fileformat bmp, hdf, jpg, pcx, tif, xwd

(2) 画像データとカラーマップを読み込む場合

[X,map] = imread([X,map] = imread([X,map] = imread([X,map] = imread(‘‘‘‘filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’))))

imfinfoimfinfoimfinfoimfinfo 画像ファイルから画像情報を獲得する場合

info = imfinfo = imfinfo = imfinfo = imfinfo(info(info(info(‘‘‘‘filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’))))

たとえばつぎのようになる.ここで,axis imageaxis imageaxis imageaxis image は画像の表示枠を画像データに合わせる

命令である.

[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');

image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;

Page 5: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

5

3.カラー画像データのファイルへの書き出し(export)方法

簡単な方法は Figure Windowのメニュー:ファイルファイルファイルファイルでエクスポートエクスポートエクスポートエクスポートを選択する.

つぎのようなファイルとして,出力できる.

bmp, eps, ai(Adobe Illustrator), tif, jpg, tifなど

Page 6: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

6

また,つぎのようなMATLAB関数が用意されている.

関数 用例

imwriteimwriteimwriteimwrite (1) 画像ファイルにデータを書き込む場合

imwrite(X, imwrite(X, imwrite(X, imwrite(X,’’’’filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’))))

(2) 画像データとカラーマップを書き込む場合

imwrite(X,map, imwrite(X,map, imwrite(X,map, imwrite(X,map,’’’’filename.bmpfilename.bmpfilename.bmpfilename.bmp’’’’))))

4.uint8 データの取り扱い方法

画像データを取り込むと,これは符号なし 8ビット整数(0から 255の整数値)になり,こ

れを uint8uint8uint8uint8と呼ぶ.たとえば,

[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');

image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;

を実行した場合,データは whoswhoswhoswhosコマンドを用いて表示すると,つぎのようになる.

>> whos>> whos>> whos>> whos

Name Size Bytes Class Name Size Bytes Class Name Size Bytes Class Name Size Bytes Class

X 600x800x3 1440000 uint8 array X 600x800x3 1440000 uint8 array X 600x800x3 1440000 uint8 array X 600x800x3 1440000 uint8 array

map 0x0 map 0x0 map 0x0 map 0x0 0 double array 0 double array 0 double array 0 double array

データ XXXXは uint8型の 600×800×3の配列になっていることがわかる.しかし,このデー

タ型はMATLABではそのままでは演算できないので,つぎのように doubledoubledoubledouble型に変換する

必要がある.

X64 = double(X)/255;X64 = double(X)/255;X64 = double(X)/255;X64 = double(X)/255;

さらに,double型を uint8型に逆変換するにはつぎのようにする.

I8 = uint8(round(X64n*255));I8 = uint8(round(X64n*255));I8 = uint8(round(X64n*255));I8 = uint8(round(X64n*255));

これら一連の演算をMファイルにするとつぎのようになる.ただし,読み出した画像に

一様乱数のノイズをかけて表示するものである.

[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');[X,map] = imread('winter.jpg');

image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;image(X);colormap(map);axis image;

X64 = double(X)/255; X64 = double(X)/255; X64 = double(X)/255; X64 = double(X)/255;

X64n = X64 + rand(size(X64)); X64n = X64 + rand(size(X64)); X64n = X64 + rand(size(X64)); X64n = X64 + rand(size(X64));

I8 = uint8(round(X64n*255)); I8 = uint8(round(X64n*255)); I8 = uint8(round(X64n*255)); I8 = uint8(round(X64n*255));

image(I8);image(I8);image(I8);image(I8);

Page 7: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

7

5.カラー成分の取り出しとトリミング

前述の RGB画像データ XXXXの R,G,B成分それぞれを取り出すには,つぎのようにする.

Xred = X(:,:,1);Xred = X(:,:,1);Xred = X(:,:,1);Xred = X(:,:,1);

Xgreen = X(:,:,2);Xgreen = X(:,:,2);Xgreen = X(:,:,2);Xgreen = X(:,:,2);

Xblue = X(:,:,3);Xblue = X(:,:,3);Xblue = X(:,:,3);Xblue = X(:,:,3);

画像の左上隅(1,1)-(256,256)のみを取り出すにはつぎのようにする.

Xred256 = Xred(1:256,1:256);Xred256 = Xred(1:256,1:256);Xred256 = Xred(1:256,1:256);Xred256 = Xred(1:256,1:256);

つぎのようにすると,画像のズームが可能である.

[X,map] = imread('winter.jpg'); [X,map] = imread('winter.jpg'); [X,map] = imread('winter.jpg'); [X,map] = imread('winter.jpg');

subplot(1,2,1);imagesc(X);axis image;subplot(1,2,1);imagesc(X);axis image;subplot(1,2,1);imagesc(X);axis image;subplot(1,2,1);imagesc(X);axis image;

subplot(1,2,2);imagesc(X);axis([1,2subplot(1,2,2);imagesc(X);axis([1,2subplot(1,2,2);imagesc(X);axis([1,2subplot(1,2,2);imagesc(X);axis([1,256,1,256])56,1,256])56,1,256])56,1,256])

Page 8: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

8

6.画像処理手法のいろいろ

6.1 画像データと近傍処理

画像データは 2 次元の配列であり,1つ1つの要素が 1 画素(pixel)を表している.配列

はつぎのような形になっている.

=

),()2,()1,(

),2()2,2()1,2(

),1()2,1()1,1(

NMXMXMX

NXXX

NXXX

X

L

MOMM

L

L

各要素は画像の明るさを意味しており,連続的な明るさを整数値(0 から 255)に量子化し,

これをグレイレベルと呼んでいる.つまり,0(最小輝度=黒)から255(最大輝度=

白)である.画像データでは,周りの 8画素(8近傍画素という)を操作ウィンドウとよび,

これを一まとめにした処理が行われ,これを近傍処理という.

X(mX(mX(mX(m----1,n1,n1,n1,n----1)1)1)1)

X4と記す

X(mX(mX(mX(m----1,n)1,n)1,n)1,n)

X3と記す

X(mX(mX(mX(m----1,n+1)1,n+1)1,n+1)1,n+1)

X2と記す

X(m,nX(m,nX(m,nX(m,n----1)1)1)1)

X5と記す

X(m,n)X(m,n)X(m,n)X(m,n)

X0と記す

X(m,n+1)X(m,n+1)X(m,n+1)X(m,n+1)

X1と記す

X(m+1,nX(m+1,nX(m+1,nX(m+1,n----1)1)1)1)

X6と記す

X(m+1,n)X(m+1,n)X(m+1,n)X(m+1,n)

X7と記す

X(m+1,n+1)X(m+1,n+1)X(m+1,n+1)X(m+1,n+1)

X8と記す

6.2 加重フィルタ処理

操作ウィンドウの 9 個の要素に対応する画素に,決められた重みを加える数値を割り当

てると,種々の画像演算が可能である.

・加重フィルタ:画像データにはノイズが含まれているので,フィルタを画素に重ねて画

素値とフィルタの各行列要素の積を求め,その全体の和をとったものを中央の画素値に置

き換える積和演算を行う.つぎのような加重フィルタがある.

平滑化:下の重みによる積和を 9で割る.

1111 1111 1111

1111 1111 1111

1111 1111 1111

x方向微分:下の重みによる積和を6で割る.

----1111 0000 1111

----1111 0000 1111

----1111 0000 1111

y方向

x方向

Page 9: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

9

y方向微分:下の重みによる積和を6で割る.

----1111 ----1111 ----1111

0000 0000 0000

1111 1111 1111

Sobelの x方向微分:下の重みによる積和を8で割る.

----1111 0000 1111

----2222 0000 2222

----1111 0000 1111

Sobelの y方向微分:下の重みによる積和を8で割る.

----1111 ----2222 ----1111

0000 0000 0000

1111 2222 1111

Laplacian演算子:下の重みによる積和を4で割る.

0000 1111 0000

1111 ----4444 1111

0000 1111 0000

x方向微分は前進差分と後退差分の平均を取って,つぎのように計算している.

( ) ( ) )1,(),(),()1,(2

1),( −−+−+=

∂∂

lkVlkVlkVlkVlkx

V

これを操作ウィンド内の3つで計算し,さらに平均をとったものが上の x 方向微分になっ

ている(参考文献では3で割っているが,このように考えると6で割るべきである).

また,Laplacian演算子の場合には,操作ウィンドウ内だけの演算にするためには,x方向

微分は前進差分を用いる.

),()1,(),( lkVlkVlkx

V−+=

∂∂

さらに2階微分は次式のようになる.

)1,(),(2)1,()1,(),(),(2

2

−+−+=−∂∂

−∂∂

=∂

∂lkVlkVlkVlk

x

Vlk

x

Vlk

x

V

同様に,y方向2階微分は次式のようになる.

),1(),(2),1(),1(),(),(2

2

lkVlkVlkVlkx

Vlk

y

Vlk

y

V−+−+=−

∂∂

−∂∂

=∂

これからラプラシアンはつぎのように計算できる.

),(4),1()1,(),1()1,(),(),(2

2

2

2

lkVlkVlkVlkVlkVlky

Vlk

x

V−−+−++++=

∂+

Page 10: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

10

上記に述べた画像データに対するフィルタ出力はディジタル信号の畳み込みで表すことが

できる.画像のデータ配列を G(i,j);i=1,…,N;j=1,…,M とし,フィルタを定義する配列を

F(i,j) ;i=1,…,L;j=1,…,Lとすると,フィルタ出力は次式のようにかける.

∑∑= =

−=−=++=L

i

L

j

LMmLNnjminGjiFmny1 1

,,1;,,1);,(),(),( LL

これを直接計算する MATLAB コマンドとして,filter2(filter2(filter2(filter2(F,G)F,G)F,G)F,G)がある.MATLAB Commnd

Windowで,>> help filter2>> help filter2>> help filter2>> help filter2 とすると,つぎのように表示される.

filter2filter2filter2filter2 2次元ディジタルフィルタ

Y = FILTER2(B,X) は,2次元 FIRフィルタ行列 Bを使って,X内のデータをフィルタ

リング します.結果の Yは,2次元コンボリューションを使って計算され,Xと同じサイ

ズになります.

y = filter2(B,X,y = filter2(B,X,y = filter2(B,X,y = filter2(B,X,’’’’shapeshapeshapeshape’’’’))))は,'shape''shape''shape''shape'でででで指定されるサイズで,2次元コンボリューションに

よって計算される Yを出力します.

'same''same''same''same' - X と同じサイズになるように,コンボリューションの結果の中心部

分を出力します(デフォルト).

'valid''valid''valid''valid' - ゼロを加えずに計算されたコンボリューションの結果のみを出力

します.size(Y) < size(X)size(Y) < size(X)size(Y) < size(X)size(Y) < size(X)となります.

'full' 'full' 'full' 'full' - 完全な 2次元コンボリューションの結果を出力します.size(Y) > size(X)size(Y) > size(X)size(Y) > size(X)size(Y) > size(X)

となります.

例題:微分演算とラプラシアン演算のMATLABプログラム例(.*.*.*.*演算を用いる方法)

clear;clear;clear;clear;

X = imread('winter.jX = imread('winter.jX = imread('winter.jX = imread('winter.jpg');pg');pg');pg');

X = double(X);X = double(X);X = double(X);X = double(X);

[m,n] = size(X);[m,n] = size(X);[m,n] = size(X);[m,n] = size(X);

for loop = 1:2for loop = 1:2for loop = 1:2for loop = 1:2

if loop == 1 if loop == 1 if loop == 1 if loop == 1

filter = (1/ filter = (1/ filter = (1/ filter = (1/6666.0)*[.0)*[.0)*[.0)*[----1 0 11 0 11 0 11 0 1

----1 0 11 0 11 0 11 0 1

----1 0 1]; % x1 0 1]; % x1 0 1]; % x1 0 1]; % x----differential filterdifferential filterdifferential filterdifferential filter

else else else else

filter = filter = filter = filter = [0 1 [0 1 [0 1 [0 1 0000

1 1 1 1 ----4444 1 1 1 1

0 1 0 1 0 1 0 1 0]; % Laplacian filter0]; % Laplacian filter0]; % Laplacian filter0]; % Laplacian filter

end end end end

Page 11: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

11

Xout = zeros(m,n); Xout = zeros(m,n); Xout = zeros(m,n); Xout = zeros(m,n);

for ky = 2:m for ky = 2:m for ky = 2:m for ky = 2:m----1111

for kx = 2:n for kx = 2:n for kx = 2:n for kx = 2:n----1111

W = X(ky W = X(ky W = X(ky W = X(ky----1:ky+1,kx1:ky+1,kx1:ky+1,kx1:ky+1,kx----1:kx+1); % window1:kx+1); % window1:kx+1); % window1:kx+1); % window

F = W.*filter; F = W.*filter; F = W.*filter; F = W.*filter;

Xout(ky,kx) = sum(F(:)); Xout(ky,kx) = sum(F(:)); Xout(ky,kx) = sum(F(:)); Xout(ky,kx) = sum(F(:));

end end end end

end end end end

if if if if loop == 1loop == 1loop == 1loop == 1

X1 = Xout; X1 = Xout; X1 = Xout; X1 = Xout;

else else else else

X2 = abs(Xout); X2 = abs(Xout); X2 = abs(Xout); X2 = abs(Xout);

end end end end

endendendend

X8 = uint8(X);X8 = uint8(X);X8 = uint8(X);X8 = uint8(X);

X18 = uint8(X1);X18 = uint8(X1);X18 = uint8(X1);X18 = uint8(X1);

X28 = uint8(X2)X28 = uint8(X2)X28 = uint8(X2)X28 = uint8(X2)

figure(1);image(X8)figure(1);image(X8)figure(1);image(X8)figure(1);image(X8)

figure(2);image(X18)figure(2);image(X18)figure(2);image(X18)figure(2);image(X18)

figure(3);image(X28)figure(3);image(X28)figure(3);image(X28)figure(3);image(X28)

例題:つぎのフィルタを用いて近傍処理をするMATLABコードをまとめて示す3).

1)平滑化フィルタ:F1(加重平均),F2(単純平均)

=

=

111

111

111

9

12,

35.05.035.0

5.00.15.0

35.05.035.0

4.4

11 FF

Page 12: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

12

2)ぶれ画像生成フィルタ:F3

=

1000

0000

0000

0001

2

13F

3)無方向エッジ方向検出フィルタ:E1,右上左下方向エッジ検出フィルタ:E2

−−

−=

−−−

−−

−−−

=

011

101

110

2,

111

181

111

1 EE

% filter F1,F2,F3,E1,E2% filter F1,F2,F3,E1,E2% filter F1,F2,F3,E1,E2% filter F1,F2,F3,E1,E2

[X,map] = imread('winter.jpg'); %RGBmap[X,map] = imread('winter.jpg'); %RGBmap[X,map] = imread('winter.jpg'); %RGBmap[X,map] = imread('winter.jpg'); %RGBmap

XX = 0.5*double(X(:,:,1));XX = 0.5*double(X(:,:,1));XX = 0.5*double(X(:,:,1));XX = 0.5*double(X(:,:,1));

figure(1);figure(1);figure(1);figure(1);

subplot(2,2,1subplot(2,2,1subplot(2,2,1subplot(2,2,1); image(XX); colormap(gray);axis image;); image(XX); colormap(gray);axis image;); image(XX); colormap(gray);axis image;); image(XX); colormap(gray);axis image;

title('Original');title('Original');title('Original');title('Original');

F1 = [0.35 0.5 0.35F1 = [0.35 0.5 0.35F1 = [0.35 0.5 0.35F1 = [0.35 0.5 0.35

0.5 1.0 0.5 0.5 1.0 0.5 0.5 1.0 0.5 0.5 1.0 0.5

0.35 0.5 0.35]/4.4; 0.35 0.5 0.35]/4.4; 0.35 0.5 0.35]/4.4; 0.35 0.5 0.35]/4.4;

YF1 = filter2(F1,XX,'same');YF1 = filter2(F1,XX,'same');YF1 = filter2(F1,XX,'same');YF1 = filter2(F1,XX,'same');

subplot(2,2,2); image(YF1); colormap(gray);axis image;subplot(2,2,2); image(YF1); colormap(gray);axis image;subplot(2,2,2); image(YF1); colormap(gray);axis image;subplot(2,2,2); image(YF1); colormap(gray);axis image;

title('F1');title('F1');title('F1');title('F1');

F2 = ones(3)/9;F2 = ones(3)/9;F2 = ones(3)/9;F2 = ones(3)/9;

YF2 = filter2(F2YF2 = filter2(F2YF2 = filter2(F2YF2 = filter2(F2,XX,'same');,XX,'same');,XX,'same');,XX,'same');

subplot(2,2,3); image(YF2); colormap(gray);axis image;subplot(2,2,3); image(YF2); colormap(gray);axis image;subplot(2,2,3); image(YF2); colormap(gray);axis image;subplot(2,2,3); image(YF2); colormap(gray);axis image;

title('F2');title('F2');title('F2');title('F2');

F3 = diag([1 0 0 0 0 0 0 0 0 0 0 0 0 1])/2;F3 = diag([1 0 0 0 0 0 0 0 0 0 0 0 0 1])/2;F3 = diag([1 0 0 0 0 0 0 0 0 0 0 0 0 1])/2;F3 = diag([1 0 0 0 0 0 0 0 0 0 0 0 0 1])/2;

YF3 = filter2(F3,XX,'same');YF3 = filter2(F3,XX,'same');YF3 = filter2(F3,XX,'same');YF3 = filter2(F3,XX,'same');

subplot(2,2,4); image(YF3); colormap(gray);axis image;subplot(2,2,4); image(YF3); colormap(gray);axis image;subplot(2,2,4); image(YF3); colormap(gray);axis image;subplot(2,2,4); image(YF3); colormap(gray);axis image;

title('F3');title('F3');title('F3');title('F3');

Page 13: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

13

figure(2)figure(2)figure(2)figure(2)

E1 = [E1 = [E1 = [E1 = [----1 1 1 1 ----1 1 1 1 ----1111

----1 8 1 8 1 8 1 8 ----1111

----1 1 1 1 ----1 1 1 1 ----1];1];1];1];

YE1 = filter2(E1,XX,'same');YE1 = filter2(E1,XX,'same');YE1 = filter2(E1,XX,'same');YE1 = filter2(E1,XX,'same');

subplot(2,2,1); image(YE1); colormap(gray);axis image;subplot(2,2,1); image(YE1); colormap(gray);axis image;subplot(2,2,1); image(YE1); colormap(gray);axis image;subplot(2,2,1); image(YE1); colormap(gray);axis image;

title('E1');title('E1');title('E1');title('E1');

% % % % エッジエッジエッジエッジ強調強調強調強調

E0 = [ 0 0 0E0 = [ 0 0 0E0 = [ 0 0 0E0 = [ 0 0 0

0 1 0 0 1 0 0 1 0 0 1 0

0 0 0]; %identify filter 0 0 0]; %identify filter 0 0 0]; %identify filter 0 0 0]; %identify filter

E11 = 0.075*E1 + E0;E11 = 0.075*E1 + E0;E11 = 0.075*E1 + E0;E11 = 0.075*E1 + E0;

YE11 = filter2(E11,XX,'same');YE11 = filter2(E11,XX,'same');YE11 = filter2(E11,XX,'same');YE11 = filter2(E11,XX,'same');

subplot(2,2,2);subplot(2,2,2);subplot(2,2,2);subplot(2,2,2); image(YE11); colormap(gray);axis image; image(YE11); colormap(gray);axis image; image(YE11); colormap(gray);axis image; image(YE11); colormap(gray);axis image;

title('E11');title('E11');title('E11');title('E11');

E2 = [ 0 1 1E2 = [ 0 1 1E2 = [ 0 1 1E2 = [ 0 1 1

----1 0 11 0 11 0 11 0 1

----1 1 1 1 ----1 0];1 0];1 0];1 0];

YE2 = filter2(E2,XX,'same');YE2 = filter2(E2,XX,'same');YE2 = filter2(E2,XX,'same');YE2 = filter2(E2,XX,'same');

subplot(2,2,3); image(YE2); colormap(gray);axis image;subplot(2,2,3); image(YE2); colormap(gray);axis image;subplot(2,2,3); image(YE2); colormap(gray);axis image;subplot(2,2,3); image(YE2); colormap(gray);axis image;

title('E2');title('E2');title('E2');title('E2');

% % % % エッジエッジエッジエッジ強調強調強調強調

E0 = [ 0 0 0E0 = [ 0 0 0E0 = [ 0 0 0E0 = [ 0 0 0

0 1 0 0 1 0 0 1 0 0 1 0

0 0 0]; %identi 0 0 0]; %identi 0 0 0]; %identi 0 0 0]; %identify filterfy filterfy filterfy filter

E21 = 0.075*E2 + E0;E21 = 0.075*E2 + E0;E21 = 0.075*E2 + E0;E21 = 0.075*E2 + E0;

YE21 = filter2(E21,XX,'same');YE21 = filter2(E21,XX,'same');YE21 = filter2(E21,XX,'same');YE21 = filter2(E21,XX,'same');

subplot(2,2,4); image(YE21); colormap(gray);axis image;subplot(2,2,4); image(YE21); colormap(gray);axis image;subplot(2,2,4); image(YE21); colormap(gray);axis image;subplot(2,2,4); image(YE21); colormap(gray);axis image;

title('E21');title('E21');title('E21');title('E21');

Page 14: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

14

Page 15: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

15

6.5 2 次元フーリエ変換を用いた画像処理

6.5.1 周波数領域のフィルタリング

画像データ g(x,y)の2次元フーリエ変換は次式で与えられる.

∫ ∫∞

∞−

∞−+−= dydxxyjxygG )](2exp[),(),( ηξπηξ

逆変換は次式のようになる.

∫ ∫∞

∞−

∞−+= ηξηξπηξ ddxyjGxyg )](2exp[),(),(

さらに,周波数重み F(フィルタ関数という)をつけて逆変換すると,画像データをフィル

タ処理した別の画像データになる.

∫ ∫∞

∞−

∞−+= ηξηξπηξηξ ddxyjGFxyg f )](2exp[),(),(),(

ローパスフィルタは次式で与えられる.

≤≤

=)(0

),(1),(

otherwise

baF

ηξηξ

MATLAB にはつぎのような離散データに対する高速フーリエ変換関数がある.

関数 用途 用例

fftfftfftfft 1 次元フーリエ変換 Y=fft(X); Y=fft(X,Y=fft(X); Y=fft(X,Y=fft(X); Y=fft(X,Y=fft(X); Y=fft(X,n)n)n)n);;;;

ifftifftifftifft 1 次元フーリエ逆変換 X=ifft(Y); X=ifft(Y,n);X=ifft(Y); X=ifft(Y,n);X=ifft(Y); X=ifft(Y,n);X=ifft(Y); X=ifft(Y,n);

fft2fft2fft2fft2 2 次元フーリエ変換 Y=fft2(X); Y=fft2(X,m,n);Y=fft2(X); Y=fft2(X,m,n);Y=fft2(X); Y=fft2(X,m,n);Y=fft2(X); Y=fft2(X,m,n);

ifft2ifft2ifft2ifft2 2 次元フーリエ逆変換 X=ifft2(Y); X = ifft2(Y,m,n);X=ifft2(Y); X = ifft2(Y,m,n);X=ifft2(Y); X = ifft2(Y,m,n);X=ifft2(Y); X = ifft2(Y,m,n);

fftshiftfftshiftfftshiftfftshift ゼロ周波数がスペクトルの中

心になるように,fft,fft2 の

出力を再配置する.

Y=fftshift(X);Y=fftshift(X);Y=fftshift(X);Y=fftshift(X);

ここでは,1 次元信号はベクトルで,2次元信号は行列で表される.データ数 m,n は任意に

指定できるが,演算速度の点から2のべき乗で指定することが望ましい.

つぎは,画像データとして 256×256 のガウスノイズを与え,フーリエ変換したものをロ

ーバスフィルタ(フィルタで1とする領域は,11×11,21×21 および 41×41 の三種類)を

かけて逆変換して得た画像を出力する MATLAB プログラムである.

% 2D FOURIE FILTERING% 2D FOURIE FILTERING% 2D FOURIE FILTERING% 2D FOURIE FILTERING

% F : filter% F : filter% F : filter% F : filter

% Fsize : low% Fsize : low% Fsize : low% Fsize : low----pass filter rangepass filter rangepass filter rangepass filter range

clearclearclearclear

N = 256; Nc = N/2; %Nc : centerN = 256; Nc = N/2; %Nc : centerN = 256; Nc = N/2; %Nc : centerN = 256; Nc = N/2; %Nc : center

k = 0;k = 0;k = 0;k = 0;

Page 16: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

16

fofofofor Fsize = [5,10,20]r Fsize = [5,10,20]r Fsize = [5,10,20]r Fsize = [5,10,20]

g = randn(N); g = randn(N); g = randn(N); g = randn(N);

G = fft2(g);G=fftshift(G); G = fft2(g);G=fftshift(G); G = fft2(g);G=fftshift(G); G = fft2(g);G=fftshift(G);

F = zeros(N);F(Nc F = zeros(N);F(Nc F = zeros(N);F(Nc F = zeros(N);F(Nc----Fsize:Nc+Fsize,NcFsize:Nc+Fsize,NcFsize:Nc+Fsize,NcFsize:Nc+Fsize,Nc----Fsize:Nc+Fsize)=1;Fsize:Nc+Fsize)=1;Fsize:Nc+Fsize)=1;Fsize:Nc+Fsize)=1;

G = F.*G; G = F.*G; G = F.*G; G = F.*G;

gf = ifft2(G); gf = ifft2(G); gf = ifft2(G); gf = ifft2(G);

gfp = sqrt(gf.*conj(gf)); % gfp = sqrt(gf.*conj(gf)); % gfp = sqrt(gf.*conj(gf)); % gfp = sqrt(gf.*conj(gf)); %正値化正値化正値化正値化

th = max(gfp(:))/4; % th = max(gfp(:))/4; % th = max(gfp(:))/4; % th = max(gfp(:))/4; % 閾値閾値閾値閾値

% % % % 以下以下以下以下はははは最大強度最大強度最大強度最大強度のののの 4444 分分分分のののの 1111 をををを閾値閾値閾値閾値としてとしてとしてとして2222値化値化値化値化するするするする

for ky = 1:N for ky = 1:N for ky = 1:N for ky = 1:N

for kx = 1:Nfor kx = 1:Nfor kx = 1:Nfor kx = 1:N

if gfp(ky,kx)>th if gfp(ky,kx)>th if gfp(ky,kx)>th if gfp(ky,kx)>th

gfp2(ky,kx) = 1; gfp2(ky,kx) = 1; gfp2(ky,kx) = 1; gfp2(ky,kx) = 1;

else else else else

gfp2(ky,kx) = 0; gfp2(ky,kx) = 0; gfp2(ky,kx) = 0; gfp2(ky,kx) = 0;

end end end end

end end end end

end end end end

figure(1) figure(1) figure(1) figure(1)

k = k+1; k = k+1; k = k+1; k = k+1;

np = 3*(k np = 3*(k np = 3*(k np = 3*(k----1);1);1);1);

subplot(3,3,np+1);imagesc(F);axis square;axis off; subplot(3,3,np+1);imagesc(F);axis square;axis off; subplot(3,3,np+1);imagesc(F);axis square;axis off; subplot(3,3,np+1);imagesc(F);axis square;axis off;

subplot(3,3,np+2);imagesc(gfp);axis squ subplot(3,3,np+2);imagesc(gfp);axis squ subplot(3,3,np+2);imagesc(gfp);axis squ subplot(3,3,np+2);imagesc(gfp);axis square;axis off;are;axis off;are;axis off;are;axis off;

subplot(3,3,np+3);imagesc(gfp2);axis square;axis off; subplot(3,3,np+3);imagesc(gfp2);axis square;axis off; subplot(3,3,np+3);imagesc(gfp2);axis square;axis off; subplot(3,3,np+3);imagesc(gfp2);axis square;axis off;

colormap(gray) colormap(gray) colormap(gray) colormap(gray)

if Fsize == 5, save lowpass5 gfp, end % save data to MAT_file lowpass5.mat if Fsize == 5, save lowpass5 gfp, end % save data to MAT_file lowpass5.mat if Fsize == 5, save lowpass5 gfp, end % save data to MAT_file lowpass5.mat if Fsize == 5, save lowpass5 gfp, end % save data to MAT_file lowpass5.mat

if Fsize == 10, save lowpass10 gfp, end % save data to MAT_file lowpass10.mat if Fsize == 10, save lowpass10 gfp, end % save data to MAT_file lowpass10.mat if Fsize == 10, save lowpass10 gfp, end % save data to MAT_file lowpass10.mat if Fsize == 10, save lowpass10 gfp, end % save data to MAT_file lowpass10.mat

if Fsiz if Fsiz if Fsiz if Fsize == 20, save lowpass20 gfp, end % save data to MAT_file lowpass20.mate == 20, save lowpass20 gfp, end % save data to MAT_file lowpass20.mate == 20, save lowpass20 gfp, end % save data to MAT_file lowpass20.mate == 20, save lowpass20 gfp, end % save data to MAT_file lowpass20.mat

endendendend

Page 17: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

17

6.5.2 画像演算

フーリエ変換を用いると,画像の微分やラプラシアン演算をつぎのようにして計算する

ことができる.

∫ ∫∞

∞−

∞−+= ηξηξπηξ ddxyjGxyg )](2exp[),(),(

この式から,つぎのようになる.

∫ ∫

∫ ∫∞

∞−

∞−

∞−

∞−

+=∂

+=∂

ηξηξπηξξπ

ηξηξπηξηπ

ddxyjGjy

xyg

ddxyjGjx

xyg

)](2exp[),(2),(

)](2exp[),(2),(

∫ ∫∞

∞−

∞−++−=

∂+

∂ηξηξπηξηξπ ddxyjG

y

xyg

x

xyg)](2exp[),()(4

),(),( 222

2

2

2

2

これからフィルタ関数は次式のようになる.

Page 18: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

18

)(4),(

2),(

2),(

222 ηξπηξ

ξπηξ

ηπηξ

+−=

=

=

FLaplacian

jFy

jFx

演算:

方向微分:

方向微分:

7.Image Processing Toolbox(別売のツールボックスをインストールする必要あり)

Image Processing Toolboxに装備されている画像処理専用関数について簡単に説明する.

データ変換関数一覧

関数名 機能

gray2indgray2indgray2indgray2ind [x,map] = gray2ind([x,map] = gray2ind([x,map] = gray2ind([x,map] = gray2ind(IIII,,,, n)n)n)n):強度イメージ IIII をカラーマップ gray(n)gray(n)gray(n)gray(n)をもつ

インデックス付きイメージ X に変換.nnnn を省略すると,デフォルトの 64

を使用.

[x,map] = gray[x,map] = gray[x,map] = gray[x,map] = gray2ind(bw,2ind(bw,2ind(bw,2ind(bw, n)n)n)n):バイナリイメージ bwbwbwbw をカラーマップ

gray(n)gray(n)gray(n)gray(n)をもつインデックス付きイメージ x に変換.nnnn を省略すると,デ

フォルトの 2を使用.

grayslicegrayslicegrayslicegrayslice x=grayslice(x=grayslice(x=grayslice(x=grayslice(IIII,n),n),n),n):スレッシュホールド値,1/n,2/n,...,(n-1)/n を使って,強

度イメージ IIII にスレッシュホールドを適用し,X にインデックス付きイ

メージを出力.

x=grayslice(x=grayslice(x=grayslice(x=grayslice(IIII,v),v),v),v) は,値 vvvv をスレッシュホールド値として使って,IIII にス

レッシュホールドを適用し,xxxx にインデックス付きイメージを出力.ここ

で,vvvv は 0と 1の間の値から構成されるベクトル.

適切な長さのカラーマップを使って,imshow(x,map)imshow(x,map)imshow(x,map)imshow(x,map) によりスレッシュ

ホールドを適用したイメージを可視化可能.

例題)I = imread('ngc4024m.tif');I = imread('ngc4024m.tif');I = imread('ngc4024m.tif');I = imread('ngc4024m.tif');

X = grayslice(I,16);X = grayslice(I,16);X = grayslice(I,16);X = grayslice(I,16);

imshow(I), figure, imshow(X,hot(16))imshow(I), figure, imshow(X,hot(16))imshow(I), figure, imshow(X,hot(16))imshow(I), figure, imshow(X,hot(16))

ngc4024.tifは¥toolbox¥images¥imdemosの中に収録されている画像.

im2bwim2bwim2bwim2bw bw = im2bw(bw = im2bw(bw = im2bw(bw = im2bw(IIII,level),level),level),level) :強度イメージ IIII を2値画像に変換します.

bw = im2bw(x,map,level)bw = im2bw(x,map,level)bw = im2bw(x,map,level)bw = im2bw(x,map,level) :カラーマップ mapmapmapmap をもつインデックス付 き

イメージ x x x x を2値画像に変換.

bw = im2bw(rgb,level)bw = im2bw(rgb,level)bw = im2bw(rgb,level)bw = im2bw(rgb,level) :RGB 画像 rgb rgb rgb rgb を2値画像に変換.

Page 19: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

19

例題)load treesload treesload treesload trees

BW = im2bw(X,map,0.4); BW = im2bw(X,map,0.4); BW = im2bw(X,map,0.4); BW = im2bw(X,map,0.4);

imshow(X,map), figure, imshow(BW) imshow(X,map), figure, imshow(BW) imshow(X,map), figure, imshow(BW) imshow(X,map), figure, imshow(BW)

load treesは¥toolbox¥images¥imdemosの中に収録されている画像デー

タ trees.matを読み込む.

ind2grayind2grayind2grayind2gray IIII = ind2gray(x,map) = ind2gray(x,map) = ind2gray(x,map) = ind2gray(x,map):カラーマップ mapmapmapmap をもつイメージ x を強度イメ

ージ IIII に変換.ind2grayind2grayind2grayind2gray は輝度を変更しないで,入力イメージから色調

と彩度情報を取り除く.

例題)load treesload treesload treesload trees

I = ind2gray(X,map); I = ind2gray(X,map); I = ind2gray(X,map); I = ind2gray(X,map);

imshow(X,map), figure, imshow(I) imshow(X,map), figure, imshow(I) imshow(X,map), figure, imshow(I) imshow(X,map), figure, imshow(I)

mat2graymat2graymat2graymat2gray IIII = mat2gray(a,[amin = mat2gray(a,[amin = mat2gray(a,[amin = mat2gray(a,[amin amax]) amax]) amax]) amax]):行列 A A A A を強度イメージ IIIIに変換.結果求

まる行列 IIIIは,0.0(黒)から 1.0(フル強度,または白)の範囲の値を含む.aminaminaminamin

と amax amax amax amax は,IIII の 0.0と 1.0に対応する AAAA の中の値.

IIII = mat2gray(a) = mat2gray(a) = mat2gray(a) = mat2gray(a) :aaaa の中の最小値,最大値を aminaminaminamin と amax amax amax amax の値に設

定.

例題) II= imread('winter.jpg');II= imread('winter.jpg');II= imread('winter.jpg');II= imread('winter.jpg');

II = imresize(II,0.5);II = imresize(II,0.5);II = imresize(II,0.5);II = imresize(II,0.5);

I = rgb2gray(II);I = rgb2gray(II);I = rgb2gray(II);I = rgb2gray(II);

J = filter2(fspecial('sobeJ = filter2(fspecial('sobeJ = filter2(fspecial('sobeJ = filter2(fspecial('sobel'), I);l'), I);l'), I);l'), I);

K = mat2gray(J);K = mat2gray(J);K = mat2gray(J);K = mat2gray(J);

imshow(I), figure, imshow(K)imshow(I), figure, imshow(K)imshow(I), figure, imshow(K)imshow(I), figure, imshow(K)

*fspecial(fspecial(fspecial(fspecial(‘‘‘‘sobelsobelsobelsobel’’’’)は y方向 Sobel微分のためのつぎの重みを生成する.

[1 2 1;0 0 0;-1 -2 -1].

Page 20: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

20

rgb2grayrgb2grayrgb2grayrgb2gray IIII = rgb2gray(rgb) = rgb2gray(rgb) = rgb2gray(rgb) = rgb2gray(rgb) :トゥルーカラーイメージ rgb rgb rgb rgb をグレースケール強度

イメージ IIIIに変換.

newmap = rgb2gray(map)newmap = rgb2gray(map)newmap = rgb2gray(map)newmap = rgb2gray(map):mapmapmapmap と等価なグレースケールカラーマップを

出力.

rgb2indrgb2indrgb2indrgb2ind [x,map[x,map[x,map[x,map] = rgb2ind(rgb,n)] = rgb2ind(rgb,n)] = rgb2ind(rgb,n)] = rgb2ind(rgb,n) :RGB イメージを最小変動量子化法を使って,

インデックス付きイメージ xxxx に変換.mapmapmapmap は,最大でも nnnn 色しか含ま

ない.nnnn <= 65536.

x=rgb2ind(rgb,map)x=rgb2ind(rgb,map)x=rgb2ind(rgb,map)x=rgb2ind(rgb,map):rgbrgbrgbrgb イメージの中のカラーをカラーマップ mapmapmapmap 内

の最も近いカラーにマッチさせることにより,rgbrgbrgbrgb イメージをカラーマッ

プ mapmapmapmap をもつインデックスイメージ X に変換.size(map,1)size(map,1)size(map,1)size(map,1) は 65536

以下

[x,map]=rgb2ind(rgb,tol)[x,map]=rgb2ind(rgb,tol)[x,map]=rgb2ind(rgb,tol)[x,map]=rgb2ind(rgb,tol):RGB イメージに一様量子化法を使って,イン

デックス付きイメージ xxxx に変換.mapmapmapmap は,最大でも(floor(1/tol)+1)^3(floor(1/tol)+1)^3(floor(1/tol)+1)^3(floor(1/tol)+1)^3 色

しか含まない.toltoltoltolは,0.0から 1.0の間の値.

例題)RGB = imread('winter.jpg');RGB = imread('winter.jpg');RGB = imread('winter.jpg');RGB = imread('winter.jpg');

[X,map] = rgb2ind(RGB,128);[X,map] = rgb2ind(RGB,128);[X,map] = rgb2ind(RGB,128);[X,map] = rgb2ind(RGB,128);

imshow(X,map)imshow(X,map)imshow(X,map)imshow(X,map)

Page 21: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

21

画像表示関数:imshowimshowimshowimshow

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help imshow>> help imshow>> help imshow>> help imshow

IMSHOWIMSHOWIMSHOWIMSHOW イメージの表示

IMSHOW(I,N)IMSHOW(I,N)IMSHOW(I,N)IMSHOW(I,N) は,強度イメージ I を N 個のグレーの離散レベルで表示します.N を

省略すると,IMSHOW は 24ビット表示では 256個のグレーレベルを,他のシステムで

は 64個のグレーレベルを使います.

IMSHOW(I,[LOW HIGH])IMSHOW(I,[LOW HIGH])IMSHOW(I,[LOW HIGH])IMSHOW(I,[LOW HIGH]) は,イメージ I のデータ範囲に制約を付けて,その範囲で

グレースケール強度イメージとして表示します.値 LOW(と LOW より小さい値)は黒で,

値 HIGH(と HIGH より大きい値)は白で表現され,その間の値は,グレーの中間色で表

示されます.IMSHOW は,デフォルトのグレーレベル数を使います.[LOW HIGH]を

空行列で設定すると,IMSHOW は,[min(I(:)) max(I(:))] を使います.ここで,I の最

小値は黒で,最大値は白で表示されます.

IMSHOW(BW)IMSHOW(BW)IMSHOW(BW)IMSHOW(BW) は,バイナリイメージ BW を表示します.値 0は黒として表示し,値 1

は白として表示します.

IMSHOW(X,MAP) IMSHOW(X,MAP) IMSHOW(X,MAP) IMSHOW(X,MAP) は,カラーマップ MAP を使って,インデックス付きイメージ X を

表示します.

IMSHOW(RGB) IMSHOW(RGB) IMSHOW(RGB) IMSHOW(RGB) は,トゥルーカラーイメージ RGB を表示します.

IMSHOW(...,DISPLAY_OPTION)IMSHOW(...,DISPLAY_OPTION)IMSHOW(...,DISPLAY_OPTION)IMSHOW(...,DISPLAY_OPTION) は,DISPLAY_OPTION が 'truesize' の場合,関数

TRUESIZE を使い,また,'notruesize' の場合,関数 TRUESIZEを使わないでイメー

ジを表示します.どちらのオプションの文字列も省略して書くことができます.これら

の引数を設定しないと,IMSHOW は,'ImshowTruesize' の優先順位の設定をベースに,

関数 TRUESIZE を読み込むかどうかを決定します.

IMSHOW(x,y,A,...) IMSHOW(x,y,A,...) IMSHOW(x,y,A,...) IMSHOW(x,y,A,...) は,デフォルトでない空間座標系を作るために,イメージの XData

と YData を設定する 2要素ベクトル x と y を使います.x と y は,2以上の要素数

をもっていますが,最初と最後の要素のみが,実際に使われることに注意してください.

IMSHOW(FILENAME) IMSHOW(FILENAME) IMSHOW(FILENAME) IMSHOW(FILENAME) は,グラフィックスファイル FILENAME に格納されている

イメージを表示します.IMSHOW は,ファイルからイメージを読み込むために

IMREAD を使いますが,MATLAB ワークスペースにイメージデータを格納することは

Page 22: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

22

ありません.ファイルは,カレントディレクトリか,または,MATLAB パス上になけれ

ばなりません.

H = IMSHOW(...) H = IMSHOW(...) H = IMSHOW(...) H = IMSHOW(...) により作成されるイメージオブジェクトのハンドルを出力します.

Imageデータのサイズ変更:imresizeimresizeimresizeimresize

>>imresize>>imresize>>imresize>>imresize

MATLABの Command Windowのヘルプ表示は次のとおりである.

IMRESIZEIMRESIZEIMRESIZEIMRESIZE は,設定した内挿法を使って,任意のタイプのイメージをリサイズします.サ

ポートする内挿法は,つぎの通りです.

'nearest''nearest''nearest''nearest' (デフォルト) 最近傍法

'bilinear' 'bilinear' 'bilinear' 'bilinear' Bilinear 法

'bicubic' 'bicubic' 'bicubic' 'bicubic' Bicubic 法

B = IMRESIZE(A,M,METHOD)B = IMRESIZE(A,M,METHOD)B = IMRESIZE(A,M,METHOD)B = IMRESIZE(A,M,METHOD) は,AAAA の大きさを MMMM 倍したイメージを出力します.MMMM

が 0と 1.0の間の値である場合,B B B B は,A A A A よりも小さくなります.MMMM が,1.0よりも大き

い場合,BBBB は,A A A A より大きくなります.METHODMETHODMETHODMETHOD を省略すると,IMRESIZEIMRESIZEIMRESIZEIMRESIZE は,最近

傍法を使用します.

B = IMRESIZE(A,[MROWS MCOLS],METHOD)B = IMRESIZE(A,[MROWS MCOLS],METHOD)B = IMRESIZE(A,[MROWS MCOLS],METHOD)B = IMRESIZE(A,[MROWS MCOLS],METHOD) は,大きさ MROWSMROWSMROWSMROWS 行 MCOLSMCOLSMCOLSMCOLS 列の

イメージを出力します.設定したサイズが入力イメージのもつ縦横比と同じ割合にならな

い場合,出力イメージは歪みます.

設定した出力の大きさが,入力イメージのサイズよりも小さく,METHODMETHODMETHODMETHOD が,'bilinear''bilinear''bilinear''bilinear',

または,'bicubic''bicubic''bicubic''bicubic' を使う場合,IMRESIZEIMRESIZEIMRESIZEIMRESIZE は,エリアジングを避けるため内挿する前にロ

ーパスフィルタを適用します.デフォルトのフィルタサイズは,11行 11列です.

つぎのステートメントを使って,デフォルトのフィルタサイズを変更することができます.

[...] = IMRESIZE(...,METHOD,N) [...] = IMRESIZE(...,METHOD,N) [...] = IMRESIZE(...,METHOD,N) [...] = IMRESIZE(...,METHOD,N)

NNNN は,フィルタのサイズ NNNN 行 NNNN 列を設定する整数のスカラ値です.NNNN が 0 の場合,

IMRESIZEIMRESIZEIMRESIZEIMRESIZE はフィルタリングのステップを省略します.

つぎのステートメントを使って,ユーザ自身のフィルタ HHHHを設定することもできます.

[...] = IMRESIZE(...,[...] = IMRESIZE(...,[...] = IMRESIZE(...,[...] = IMRESIZE(...,METHOD,H)METHOD,H)METHOD,H)METHOD,H)

HHHH は,任意の(FTRANS2,FWIND1,FWIND2,FSAMP2FTRANS2,FWIND1,FWIND2,FSAMP2FTRANS2,FWIND1,FWIND2,FSAMP2FTRANS2,FWIND1,FWIND2,FSAMP2 で出力されるような)2次元 FIR フ

ィルタです.

Page 23: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

23

Imageデータの整数算術演算関数

イメージ配列を倍精度に変換せずに,算術を行うための関数が用意されている.基本演算(加

算,減算,乗算,除算)に加えて,基本演算では簡単に実現できないいくつかの重要な関数(絶

対差分,線形組み合わせ,コンプリメンテーション)がある.

関数 詳細

imabsdiffimabsdiffimabsdiffimabsdiff 2つのイメージの絶対差

imaddimaddimaddimadd 2つのイメージの加算またはイメージに定数を加算

imcomplementimcomplementimcomplementimcomplement イメージの Complement

imdivideimdivideimdivideimdivide 2つのイメージの除算またはイメージを定数で除算

imlincombimlincombimlincombimlincomb イメージの線形の組み合わせ

immultiplyimmultiplyimmultiplyimmultiply 2つのイメージの乗算,または定数によるイメージの乗算

imsubtractimsubtractimsubtractimsubtract 2つのイメージの減算,またはイメージから定数を減算

例題)2つのイメージの加算

I = imread('rice.tif'); I = imread('rice.tif'); I = imread('rice.tif'); I = imread('rice.tif');

J = imread('cameraman.t J = imread('cameraman.t J = imread('cameraman.t J = imread('cameraman.tif');if');if');if');

K = imadd(I,J); K = imadd(I,J); K = imadd(I,J); K = imadd(I,J);

imshow(K) imshow(K) imshow(K) imshow(K)

イメージに定数を加算

II = imread('winter.jpg');II = imread('winter.jpg');II = imread('winter.jpg');II = imread('winter.jpg');

II = imresize(II,0.5);II = imresize(II,0.5);II = imresize(II,0.5);II = imresize(II,0.5);

I = rgb2gray(II);I = rgb2gray(II);I = rgb2gray(II);I = rgb2gray(II);

J = filter2(fspecial('sobel'), I);J = filter2(fspecial('sobel'), I);J = filter2(fspecial('sobel'), I);J = filter2(fspecial('sobel'), I);

IJ = imadd(I,20);IJ = imadd(I,20);IJ = imadd(I,20);IJ = imadd(I,20);

imshow(J), figure, imshow(K)imshow(J), figure, imshow(K)imshow(J), figure, imshow(K)imshow(J), figure, imshow(K)

Page 24: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

24

画像の回転関数:imrotate.mimrotate.mimrotate.mimrotate.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help imrotate>> help imrotate>> help imrotate>> help imrotate

IMROTATEIMROTATEIMROTATEIMROTATE イメージの回転

B = IMROTATE(A,ANGLE,METHOD)B = IMROTATE(A,ANGLE,METHOD)B = IMROTATE(A,ANGLE,METHOD)B = IMROTATE(A,ANGLE,METHOD) は,設定した内挿法を使って,イメージ A A A A を反

時計周りに ANGLEANGLEANGLEANGLE 度回転します.METHODMETHODMETHODMETHOD は,つぎの 3つの中から選択できる文字列

です.

'nearest' 'nearest' 'nearest' 'nearest' (デフォルト) 最近傍法

'bilinear''bilinear''bilinear''bilinear' Bilinear 法

'bicubic' 'bicubic' 'bicubic' 'bicubic' Bicubic 法

引数 METHOD METHOD METHOD METHOD を省略すると,IMROTATEIMROTATEIMROTATEIMROTATE はデフォルトの 'nearest' 'nearest' 'nearest' 'nearest' を使います.イメ

ージを時計周りに回転させるには,負の角度を設定してください.

B = IMROTATE(A,ANGLE,METHOD,BBOX) B = IMROTATE(A,ANGLE,METHOD,BBOX) B = IMROTATE(A,ANGLE,METHOD,BBOX) B = IMROTATE(A,ANGLE,METHOD,BBOX) は,イメージ A A A A を ANGLE ANGLE ANGLE ANGLE だけ回転させ

ます.イメージを包む bounding ボックスは,引数 BBOXBBOXBBOXBBOX で設定され,'loose''loose''loose''loose',または,

'crop''crop''crop''crop'のいずれかを設定することができます.BBOXBBOXBBOXBBOX が,'loose''loose''loose''loose'の場合,BBBB は,回転したイ

メージ全体を包むので,一般には,AAAA より大きくなります.BBOXBBOXBBOXBBOX が,'crop''crop''crop''crop'の場合,回

転したイメージの中央部のみが包まれ,AAAA と同じサイズになります.引数 BBOXBBOXBBOXBBOX を省略

すると,IMROTATEIMROTATEIMROTATEIMROTATE は,デフォルトの 'loose' 'loose' 'loose' 'loose' を使います.

IMROTATE IMROTATE IMROTATE IMROTATE は,B B B B の外側に不要な値として 0を設定します.

例題) I = imread('winter.jpg');I = imread('winter.jpg');I = imread('winter.jpg');I = imread('winter.jpg');

II = imresize(I,0.5);II = imresize(I,0.5);II = imresize(I,0.5);II = imresize(I,0.5);

J = imrotate(II,J = imrotate(II,J = imrotate(II,J = imrotate(II,----30,'bilinea30,'bilinea30,'bilinea30,'bilinear','crop');r','crop');r','crop');r','crop');

imshow(II), figure, imshow(J)imshow(II), figure, imshow(J)imshow(II), figure, imshow(J)imshow(II), figure, imshow(J)

Page 25: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

25

2Dフィルタ関数:fspecial.mfspecial.mfspecial.mfspecial.m

2 次元の指定したタイプのフィルタの作成する関数でヘルプによる説明はつぎのとおり

である.

>> help fspecial>> help fspecial>> help fspecial>> help fspecial

H = FSPECIAL(TYPE) H = FSPECIAL(TYPE) H = FSPECIAL(TYPE) H = FSPECIAL(TYPE) は指定したタイプの 2 次元フィルタ H を作成します.TYPE

に対して,可能な値は,つぎのものです.

'average''average''average''average' 平均化フィルタ

'disk' 'disk' 'disk' 'disk' 巡回平均化フィルタ

'gaussian''gaussian''gaussian''gaussian' Gaussian ローパスフィルタ

'laplacian' 'laplacian' 'laplacian' 'laplacian' 2次元 Laplacian 演算子を近似するフィルタ

'log''log''log''log' Gaussian フィルタの Laplacian

'motion' 'motion' 'motion' 'motion' モーションフィルタ

'prewitt' 'prewitt' 'prewitt' 'prewitt' Prewitt 水平方向エッジ強調フィルタ

'sobel''sobel''sobel''sobel' Sobel 水平方向エッジ強調フィルタ

'unsharp' 'unsharp' 'unsharp' 'unsharp' 鮮明でないコントラストを強調するフィルタ

TYPETYPETYPETYPE に依存して,FSPECIAL FSPECIAL FSPECIAL FSPECIAL は,設定できる付加的なパラメータを使用することがで

きます.これらのパラメータには,すべてデフォルト値が用意されています.

H = FSPECIAL('average',HSIZE) H = FSPECIAL('average',HSIZE) H = FSPECIAL('average',HSIZE) H = FSPECIAL('average',HSIZE) は,サイズ HSIZEHSIZEHSIZEHSIZE の平均化フィルタ HHHH を戻します.

HSIZEHSIZEHSIZEHSIZE は,HHHH の行数と列数を指定するベクトルであるか,または,HHHH が正方行列の場合,

その大きさを設定するスカラ値です.デフォルトの HSIZEHSIZEHSIZEHSIZE は,[3 3] です.

H = FH = FH = FH = FSPECIAL('disk',RADIUS)SPECIAL('disk',RADIUS)SPECIAL('disk',RADIUS)SPECIAL('disk',RADIUS) は,2*RADIUS+12*RADIUS+12*RADIUS+12*RADIUS+1 の大きさの正方行列になる巡回平均

化フィルタを戻します.デフォルトの RADIUSRADIUSRADIUSRADIUS は,5です.

H = FSPECIAL('gaussian',HSIZE,SIGMA) H = FSPECIAL('gaussian',HSIZE,SIGMA) H = FSPECIAL('gaussian',HSIZE,SIGMA) H = FSPECIAL('gaussian',HSIZE,SIGMA) は,標準偏差 SIGMASIGMASIGMASIGMA(正)をもつサイズ

HSIZEHSIZEHSIZEHSIZE の点対称 Gaussian ローパスフィルタを戻します.HSIZEHSIZEHSIZEHSIZE は,HHHH の行数と列数

を指定するベクトルであるか,または,HHHH が正方行列の場合,その大きさを設定するスカ

ラ値です.HSIZEHSIZEHSIZEHSIZE のデフォルト値は,[3 3]で,SISISISIGMAGMAGMAGMA のデフォルトは 0.5です.

H = FSPECIAL('laplacian',ALPHA) H = FSPECIAL('laplacian',ALPHA) H = FSPECIAL('laplacian',ALPHA) H = FSPECIAL('laplacian',ALPHA) は,2次元の Laplacian 演算子の型に近似した 3

行 3列のフィルタです.パラメータ ALPHA ALPHA ALPHA ALPHA は,Laplacian の型をコントロールするもの

で,0.0と 1.0 の間の値です.ALPHAALPHAALPHAALPHA のデフォルト値は,0.2 です.

H = FSPECIAL('log',HSIZE,SIGMA)H = FSPECIAL('log',HSIZE,SIGMA)H = FSPECIAL('log',HSIZE,SIGMA)H = FSPECIAL('log',HSIZE,SIGMA) は,標準偏差 SIGMASIGMASIGMASIGMA(正)をもつサイズ HSIHSIHSIHSIZEZEZEZE

Page 26: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

26

の Gaussian フィルタの点対称 Laplacian を出力します.HSIZE HSIZE HSIZE HSIZE は,H H H H の行数と列数を

指定するベクトルであるか,または,HHHH が正方行列の場合,その大きさを設定するスカラ

値です.HSIZEHSIZEHSIZEHSIZE のデフォルト値は,[5 5]で,SIGMA SIGMA SIGMA SIGMA のデフォルトは 0.5です.

H = FSPECIAL('motion',LEN,THETA)H = FSPECIAL('motion',LEN,THETA)H = FSPECIAL('motion',LEN,THETA)H = FSPECIAL('motion',LEN,THETA) は,イメージとコンボリューションし,LENLENLENLEN ピ

クセル分,カメラの線形移動を行い,反時計周りに THETATHETATHETATHETA 度の回転した結果を出力しま

す.フィルタは,水平方向と垂直方向への動作を実現するものです.デフォルトの LENLENLENLEN は

9で,デフォルトの THETA THETA THETA THETA は 0で,これは,水平方向に 9ピクセル移動したものに対応

します.

H = FSPECIAL('prewitt') H = FSPECIAL('prewitt') H = FSPECIAL('prewitt') H = FSPECIAL('prewitt') は,垂直方向の勾配を近似することにより,水平方向のエッ

ジを強調する 3 行 3 列のフィルタを出力します.垂直エッジを強調する必要がある場合,

フィルタ H を転置 H'H'H'H' してください.

[1 1 1;0 0 0;-1 -1 -1].

H = FSPECIAL('sobel') H = FSPECIAL('sobel') H = FSPECIAL('sobel') H = FSPECIAL('sobel') は,垂直方向の勾配を近似することにより,平滑化の影響を利

用して,水平方向のエッジを強調する 3行 3列のフィルタを戻します.

垂直方向のエッジを強調したい場合,フィルタH を転置 H'H'H'H' を行ってください.

[1 2 1;0 0 0;-1 -2 -1].

H = FSPECIAL('unsharp',ALPHA)H = FSPECIAL('unsharp',ALPHA)H = FSPECIAL('unsharp',ALPHA)H = FSPECIAL('unsharp',ALPHA) は,3行 3列で,コントラストを強調するフィルタ

を戻します.FSPECIALFSPECIALFSPECIALFSPECIAL は,パラメータ ALPHA ALPHA ALPHA ALPHA を使って,Laplacian フィルタの負の

部分を利用して,コントラストがはっきりしないフィルタを作成します.ALPHA ALPHA ALPHA ALPHA は,

Laplacian の型をコントロールするもので,0.0 から 1.0 の間の値です,デフォルトは,

ALPHA ALPHA ALPHA ALPHA = 0.2 です.

整数演算フィルタ関数 : imfilter.mimfilter.mimfilter.mimfilter.m

イメージ配列を倍精度に変換せずに(一般の演算で大きくメモリ利用量を削減して)フィル

タリングを実行する関数が追加されています.境界のパディングオプションを指定するこ

とができます.また,高次の次元のフィルタリングを実行できる.MATLABの Command

Windowのヘルプ表示は次のとおりである.

>> help imfilter>> help imfilter>> help imfilter>> help imfilter

IMFILTER IMFILTER IMFILTER IMFILTER 多次元イメージのフィルタ操作

B = IMFILTER(A,H)B = IMFILTER(A,H)B = IMFILTER(A,H)B = IMFILTER(A,H) は,多次元フィルタ HHHH を使って,多次元配列 AAAA をフィルタリン

Page 27: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

27

グします.AAAA は,任意のクラスと次元をもつ非スパースの数値配列です.結果の BBBB は,

AAAA と同じサイズとクラスをもっています.出力 B B B B の個々の要素は,倍精度の浮動少数点

を使って計算します.AAAA が整数配列の場合,整数タイプの範囲を超えた出力要素は,打

ち切られ,小数点以下は丸められます.

B = IMFIL B = IMFIL B = IMFIL B = IMFILTER(A,H,OPTION1,OPTION2,...)TER(A,H,OPTION1,OPTION2,...)TER(A,H,OPTION1,OPTION2,...)TER(A,H,OPTION1,OPTION2,...) は,指定した OPTION に従って,多次

元のフィルタリングを行います.OPTION 引数は,つぎのいずれかを設定します.

- 境界に関するオプション

XXXX 配列の境界の外に位置する入力配列値は,陰的に,値 X

と仮定します.境界に関するオプションが存在しない場

合,IMFILTER は,X = 0 を使います.

'symmetric''symmetric''symmetric''symmetric' 配列の境界の外に位置する入力配列値は,配列の境界を

跨いで,配列の鏡像を使って計算します.

'replicate''replicate''replicate''replicate' 配列の境界の外に位置する入力配列値は,最近傍の配列

境界値と等しいと仮定しています.

'circular''circular''circular''circular' 配列の境界の外に位置する入力配列値は,入力配列が,

周期的であると,陰的に仮定しています.

- 出力サイズオプション

(IMFILTERIMFILTERIMFILTERIMFILTER に関する出力サイズオプションは,関数 CONV2CONV2CONV2CONV2 や FILTER2FILTER2FILTER2FILTER2 の

SHAPE SHAPE SHAPE SHAPE オプションに似ています)

'same' 'same' 'same' 'same' 出力配列は,入力配列と同じサイズです.出力に関する

サイズオプションが設定されていない場合,デフォルト

の挙動をします.

'full''full''full''full' 出力配列は,フルのフィルタを適用した結果で,そのた

めに,入力配列より大きくなります.

- 相関とコンボリューション

'corr' 'corr' 'corr' 'corr' IMFILTER は,相関を使って,多次元フィルタ操作を行い

ます.

ここでは,FILTER2 FILTER2 FILTER2 FILTER2 が行うフィルタ操作と同じ方法です,相関,または,コンボリュー

ション,共に,オプションが存在していない場合,IMFILTERIMFILTERIMFILTERIMFILTER は,相関を使います.

'conv' 'conv' 'conv' 'conv' IMFILTER IMFILTER IMFILTER IMFILTER は,コンボリューションを使って,多次元の

フィルタ操作を行います.

Page 28: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

28

例題 rgb = imread(' rgb = imread(' rgb = imread(' rgb = imread('winter.jpgwinter.jpgwinter.jpgwinter.jpg'); '); '); ');

h = fspecial('motion',50,45); h = fspecial('motion',50,45); h = fspecial('motion',50,45); h = fspecial('motion',50,45);

rgb2 = imfilter(rgb,h); rgb2 = imfilter(rgb,h); rgb2 = imfilter(rgb,h); rgb2 = imfilter(rgb,h);

imshow(rgb), title('Original') imshow(rgb), title('Original') imshow(rgb), title('Original') imshow(rgb), title('Original')

figure, figure, figure, figure, imshow(rgb2), title('Filtered') imshow(rgb2), title('Filtered') imshow(rgb2), title('Filtered') imshow(rgb2), title('Filtered')

rgb3 = imfilter(rgb,h,'replicate'); rgb3 = imfilter(rgb,h,'replicate'); rgb3 = imfilter(rgb,h,'replicate'); rgb3 = imfilter(rgb,h,'replicate');

figure, imshow(rgb3), title('Filtered with boundary replication') figure, imshow(rgb3), title('Filtered with boundary replication') figure, imshow(rgb3), title('Filtered with boundary replication') figure, imshow(rgb3), title('Filtered with boundary replication')

フィルタ関数:nlfilter.mnlfilter.mnlfilter.mnlfilter.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help nlfilter>> help nlfilter>> help nlfilter>> help nlfilter

NLFILTERNLFILTERNLFILTERNLFILTER 一般的なスライディングを伴う近傍処理を実行

B = NLFILTER(A,[M N],FUN) B = NLFILTER(A,[M N],FUN) B = NLFILTER(A,[M N],FUN) B = NLFILTER(A,[M N],FUN) は,関数 FUNFUNFUNFUN を AAAA の各々 M M M M 行 NNNN 列 のスライディン

グブロックに適用します.FUNFUNFUNFUN は,入力として M M M M 行 N N N N 列のブロックを受け入れ,つぎ

の関数を満たす出力を行います.

C = FUN(X)C = FUN(X)C = FUN(X)C = FUN(X)

ここで,CCCC は,MMMM 行 NNNN 列のブロック XXXX の中心ピクセルの出力値になります.NLFILTER NLFILTER NLFILTER NLFILTER

は,AAAA の各ピクセルに対して,FUNFUNFUNFUN を読み込みます.NLFILTERNLFILTERNLFILTERNLFILTER は,MMMM 行 NNNN 列のブ

ロックにするために,必要な場合エッジにゼロを付加します.

B = NLFILTER(A,[M N],FUN,P1,P2,...)B = NLFILTER(A,[M N],FUN,P1,P2,...)B = NLFILTER(A,[M N],FUN,P1,P2,...)B = NLFILTER(A,[M N],FUN,P1,P2,...) は,付加的なパラメータ P1,P2,...P1,P2,...P1,P2,...P1,P2,... を FUNFUNFUNFUN に転

送します.

B = NLFILTER(A,'indexed',...) B = NLFILTER(A,'indexed',...) B = NLFILTER(A,'indexed',...) B = NLFILTER(A,'indexed',...) は,AAAA のクラスが double の場合 0を,uint8 の場合 1を

付加してインデックス付きイメージとして AAAA を処理します.

例題) rgb = imread('winter.jpg'); rgb = imread('winter.jpg'); rgb = imread('winter.jpg'); rgb = imread('winter.jpg');

I = rgb2gray(rgb);I = rgb2gray(rgb);I = rgb2gray(rgb);I = rgb2gray(rgb);

fun = inline('mafun = inline('mafun = inline('mafun = inline('max(x(:))');x(x(:))');x(x(:))');x(x(:))');

I2 = nlfilter(I,[3 3],fun);I2 = nlfilter(I,[3 3],fun);I2 = nlfilter(I,[3 3],fun);I2 = nlfilter(I,[3 3],fun);

imshow(I);figure,imshow(I2);imshow(I);figure,imshow(I2);imshow(I);figure,imshow(I2);imshow(I);figure,imshow(I2);

Page 29: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

29

エッジ検出関数 : edge.medge.medge.medge.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help edge>> help edge>> help edge>> help edge

EDGEEDGEEDGEEDGE 強度イメージ内のエッジの検出

EDGEEDGEEDGEEDGE は,強度イメージ IIII を入力として取り入れて,IIII と同じ大きさのバイナリイメー

ジ BWBWBWBW を出力します.このイメージは,エッジの部分が 1で,他が 0を出力したもので

す.EDGEEDGEEDGEEDGE は,つぎの 6つのエッジ検出法をサポートします.

Sobel 法は,微係数に Sobel 近似を使ってエッジの検出を行います.IIII の勾配が最大に

なる点をエッジとして出力します.

Prewitt 法は,微係数に Prewitt 近似を使ってエッジの検出を行います.IIII の勾配が最

大になる点をエッジとします.

Roberts 法は,微係数に Roberts 近似を使ってエッジ検出を行います.I I I I の勾配が最大

になる点をエッジとします.

Gaussian の Laplacian 法は,Gaussian フィルタの Laplacian で,I I I I をフィルタリン

グした後,ゼロクロッシング法を使ってエッジ検出を行います.

zero-cross 法は,ユーザが設定したフィルタで,I I I I をフィルタリングした後ゼロクロッシ

ング法を使ってエッジ検出を行います.

Canny 法は,IIII の勾配の極大を求めることによりエッジ検出を行います.この勾配計算

には,Gaussian フィルタの微係数を使います.この方法では,2つのスレッシュホール

ドを使って,強いエッジと弱いエッジを検出します.そして弱いエッジが強いエッジに

接続されている場合に限り,弱いエッジを出力に含めます.そのため,この方法は,他

の方法に比べてノイズの影響を受けにくくより正確に弱いエッジを検出します.

どの手法を指定するかにより,適用できるパラメータも異なります.手法を指定しない

場合は,EDGEEDGEEDGEEDGE は,Sobel 法を使用します.

Sobel 法

------------

BW = EDGE(I,'sobel')BW = EDGE(I,'sobel')BW = EDGE(I,'sobel')BW = EDGE(I,'sobel') は,Sobel 法を設定します.

Page 30: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

30

BW = EDGE(I,'sobel',THRESBW = EDGE(I,'sobel',THRESBW = EDGE(I,'sobel',THRESBW = EDGE(I,'sobel',THRESH)H)H)H) は,Sobel 法に対する感度スレッシュホールドを設定

します.EDGE は,THRESH より弱いエッジをすべて無視します.THRESH を設定

しないか,THRESH が空([])である場合,EDGE は,自動的に値を選択します.

BW = EDGE(I,'sobel',THRESH,DIRECTION)BW = EDGE(I,'sobel',THRESH,DIRECTION)BW = EDGE(I,'sobel',THRESH,DIRECTION)BW = EDGE(I,'sobel',THRESH,DIRECTION) は,Sobel 法に方向性を加えます.

DIRECTION は,'horizontal' エッジ,'vertical' エッジ,'both' (デフォルト)の内,どの

方向の検索を実行するかを設定する文字列です.

[BW,thresh] = EDGE(I,'sobel',...)[BW,thresh] = EDGE(I,'sobel',...)[BW,thresh] = EDGE(I,'sobel',...)[BW,thresh] = EDGE(I,'sobel',...) は,スレッシュホールド値を出力します.

Prewitt 法

-------------

BW = EDGE(I,'prewitt') BW = EDGE(I,'prewitt') BW = EDGE(I,'prewitt') BW = EDGE(I,'prewitt') は,Prewitt 法を設定します.

BW = EDGE(I,'prewitt',THRESH) BW = EDGE(I,'prewitt',THRESH) BW = EDGE(I,'prewitt',THRESH) BW = EDGE(I,'prewitt',THRESH) は,Prewitt 法に対する感度スレッシュホールドを

設定します.EDGE は,THRESH より弱いエッジをすべて無視します.THRESH を

設定しないか,THRESH が空([])である場合,EDGE は自動的に値を選択します.

BW = EDGE(I,'prewitt',THRESH,DIRECTION)BW = EDGE(I,'prewitt',THRESH,DIRECTION)BW = EDGE(I,'prewitt',THRESH,DIRECTION)BW = EDGE(I,'prewitt',THRESH,DIRECTION) は,Prewitt 法に方向性を加えます.

DIRECTION は,'horizontal' エッジ,'vertical' エッジ,'both' (デフォルト)の内,どの

方向の検索を実行するかを設定する文字列です.

[BW,thresh] = EDGE(I,'prewitt',...) [BW,thresh] = EDGE(I,'prewitt',...) [BW,thresh] = EDGE(I,'prewitt',...) [BW,thresh] = EDGE(I,'prewitt',...) は,スレッシュホールド値を出力します.

Roberts 法

-------------

BW = EDGE(I,'roberts') BW = EDGE(I,'roberts') BW = EDGE(I,'roberts') BW = EDGE(I,'roberts') は,Roberts 法を設定します.

BW = EDGE(I,'roberts',THRESH)BW = EDGE(I,'roberts',THRESH)BW = EDGE(I,'roberts',THRESH)BW = EDGE(I,'roberts',THRESH) は,Roberts 法に対する感度スレッシュホールドを

設定します.EDGE は,THRESH より弱いエッジをすべて無視します.THRESH を

設定しないか,THRESH が空([])である場合,EDGE は自動的に値を選択します.

[BW,thresh] = EDGE(I,'ro[BW,thresh] = EDGE(I,'ro[BW,thresh] = EDGE(I,'ro[BW,thresh] = EDGE(I,'roberts',...)berts',...)berts',...)berts',...) は,スレッシュホールド値を出力します.

Page 31: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

31

Gaussian の Laplacian 法

-------------

BW = EDGE(I,'log')BW = EDGE(I,'log')BW = EDGE(I,'log')BW = EDGE(I,'log') は,Gaussian の Laplacian 法を設定します.

BW = EDGE(I,'log',THRESH)BW = EDGE(I,'log',THRESH)BW = EDGE(I,'log',THRESH)BW = EDGE(I,'log',THRESH) は,Gaussian の Laplacian 法に対する感度スレッシュ

ホールドを設定します.EDGEEDGEEDGEEDGE は,THRESHTHRESHTHRESHTHRESH より弱いエッジをすべて無視します.

THRESHTHRESHTHRESHTHRESH を設定しないか,THRTHRTHRTHRESHESHESHESH が空([])である場合,EDGEEDGEEDGEEDGE は自動的に値を選択

します.

BW = EDGE(I,'log',THRESH,SIGMA)BW = EDGE(I,'log',THRESH,SIGMA)BW = EDGE(I,'log',THRESH,SIGMA)BW = EDGE(I,'log',THRESH,SIGMA) は,SIGMASIGMASIGMASIGMA を LoG フィルタの標準偏差として

使用して,Gaussian の Laplacian 法を設定します.デフォルトの SIGMASIGMASIGMASIGMA は 2 です.

そして,フィルタのサイズは N 行 N 列です.ここで,N = CEIL(SIGMA*3)*2+1N = CEIL(SIGMA*3)*2+1N = CEIL(SIGMA*3)*2+1N = CEIL(SIGMA*3)*2+1です.

[BW,thresh] = EDGE(I,'log',...)[BW,thresh] = EDGE(I,'log',...)[BW,thresh] = EDGE(I,'log',...)[BW,thresh] = EDGE(I,'log',...) は,スレッシュホールドを出力します.

Zero-cross 法

-------------

BW = EDGE(I,'zerocross',THRESH,H)BW = EDGE(I,'zerocross',THRESH,H)BW = EDGE(I,'zerocross',THRESH,H)BW = EDGE(I,'zerocross',THRESH,H) は,設定したフィルタ H を使って, zero-cross

法を設定します.THRESHTHRESHTHRESHTHRESH が空([])である場合,EDGEEDGEEDGEEDGE は自動的に感度スレッシュホー

ルドを選択します.

[BW,THRESH] = EDGE(I,'zerocross',...)[BW,THRESH] = EDGE(I,'zerocross',...)[BW,THRESH] = EDGE(I,'zerocross',...)[BW,THRESH] = EDGE(I,'zerocross',...) は,スレッシュホールド値を出力します.

Canny 法

-------------

BW = BW = BW = BW = EDGE(I,'canny') EDGE(I,'canny') EDGE(I,'canny') EDGE(I,'canny') は,Canny 法を設定します.

BW = EDGE(I,'canny',THRESH) BW = EDGE(I,'canny',THRESH) BW = EDGE(I,'canny',THRESH) BW = EDGE(I,'canny',THRESH) は,Canny 法に対する感度スレッシュホールドを設

定します.THRESHTHRESHTHRESHTHRESH は,第 1 要素が低いスレッシュホールド,第 2 要素が高いスレッ

シュホールドである 2要素ベクトルです.THRESHTHRESHTHRESHTHRESH にスカラを設定する場合,この値を

高いスレッシュホールド,0.4*THRESH0.4*THRESH0.4*THRESH0.4*THRESH を低いスレッシュホールドに設定します.

THRESHTHRESHTHRESHTHRESH を設定しないか,THRESHTHRESHTHRESHTHRESH が空([ ])である場合,EDGEDGEDGEDGEEEE は,自動的に低い値

と高い値を選択します.

BW = EDGE(I,'canny',THRESH,SIGMA) BW = EDGE(I,'canny',THRESH,SIGMA) BW = EDGE(I,'canny',THRESH,SIGMA) BW = EDGE(I,'canny',THRESH,SIGMA) は,SIGMASIGMASIGMASIGMA を Gaussian フィルタの標準偏

差として使用して,Canny 法を設定します.デフォルトの SIGMASIGMASIGMASIGMA は 1です.そして,

Page 32: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

32

SIGMASIGMASIGMASIGMA に基づいて,このフィルタのサイズを自動的に選択します.

[BW,thresh] = EDGE(I,'canny',...) [BW,thresh] = EDGE(I,'canny',...) [BW,thresh] = EDGE(I,'canny',...) [BW,thresh] = EDGE(I,'canny',...) は,スレッシュホールド値を 2要素ベクトルとして出

力します.

注意

-------

'log' と 'zerocross' 法に対して,0のスレッシュホールドを設定する場合,出力イメージ

は閉じたコンター群になります.これは,入力イメージの中でゼロクロスする部分をすべ

て含むためです.

例題

-------

Prewitt 法と Canny 法を使って,winter.jpgの強度イメージのエッジ検出を行う.

rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');

rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);

I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);

BW1 = edge(I,'pBW1 = edge(I,'pBW1 = edge(I,'pBW1 = edge(I,'prewitt');rewitt');rewitt');rewitt');

BW2 = edge(I,'canny');BW2 = edge(I,'canny');BW2 = edge(I,'canny');BW2 = edge(I,'canny');

imshow(I)imshow(I)imshow(I)imshow(I)

figure, imshow(BW1)figure, imshow(BW1)figure, imshow(BW1)figure, imshow(BW1)

figure, imshow(BW2)figure, imshow(BW2)figure, imshow(BW2)figure, imshow(BW2)

強度調整関数:imadjust.mimadjust.mimadjust.mimadjust.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help imadjust>> help imadjust>> help imadjust>> help imadjust

IMADJUSTIMADJUSTIMADJUSTIMADJUST イメージの強度値,または,カラーマップを調整

J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA)J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA)J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA)J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA) は,強度イ

メージ I I I I の LOW_INLOW_INLOW_INLOW_IN から HIGH_IN HIGH_IN HIGH_IN HIGH_IN までの範囲の値を,LOW_OUTLOW_OUTLOW_OUTLOW_OUT から HIGH_OUT HIGH_OUT HIGH_OUT HIGH_OUT

の範囲にマッピングすることにより JJJJ を作成します.LOW_INLOW_INLOW_INLOW_IN より小さい値は

Page 33: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

33

LOW_OUTLOW_OUTLOW_OUTLOW_OUT に,HIGH_IN HIGH_IN HIGH_IN HIGH_IN よりも大きい値は HIGH_OUTHIGH_OUTHIGH_OUTHIGH_OUT にマッピングします.

[LOW_IN HIGH_IN] [LOW_IN HIGH_IN] [LOW_IN HIGH_IN] [LOW_IN HIGH_IN] やややや [LOW_OUT HIGH_OUT] [LOW_OUT HIGH_OUT] [LOW_OUT HIGH_OUT] [LOW_OUT HIGH_OUT] が空行列の場合,デフォルトの[0 1]

を使います.

NEWMAP = IMADJUST(MAP,NEWMAP = IMADJUST(MAP,NEWMAP = IMADJUST(MAP,NEWMAP = IMADJUST(MAP, [LOW_IN; HIGH_IN],[LOW_IN; HIGH_IN],[LOW_IN; HIGH_IN],[LOW_IN; HIGH_IN], [L[L[L[LOW_OUT; OW_OUT; OW_OUT; OW_OUT;

HIGH_OUT],GAMMA)HIGH_OUT],GAMMA)HIGH_OUT],GAMMA)HIGH_OUT],GAMMA) は,インデックス付きイメージに関連したカラーマップを変換し

ます.LOW_INLOW_INLOW_INLOW_IN,,,,HIGH_INHIGH_INHIGH_INHIGH_IN,,,,LOW_OUTLOW_OUTLOW_OUTLOW_OUT,,,,HIGH_OUTHIGH_OUTHIGH_OUTHIGH_OUT,,,,GAMMAGAMMAGAMMAGAMMA がスカラの場合,同

一のマッピングが,赤,緑,青の成分に適用されます.各カラー成分毎に,ユニークなマ

ッピングは,つぎの場合に有効です.

LOW_INLOW_INLOW_INLOW_IN と HIGH_INHIGH_INHIGH_INHIGH_IN が,1行 3列のベクトル,または,LOW_OUTLOW_OUTLOW_OUTLOW_OUT と HIGH_OUTHIGH_OUTHIGH_OUTHIGH_OUT が

1行 3列のベクトル,または,GAMMAGAMMAGAMMAGAMMA が 1行 3列のベクトルのいずれかの場合,再スケ

ーリングされたカラーマップ,NEWMAPNEWMAPNEWMAPNEWMAP は,MAPMAPMAPMAP と同じサイズです.

RGB2 = IMADJUST(RGB1,...) RGB2 = IMADJUST(RGB1,...) RGB2 = IMADJUST(RGB1,...) RGB2 = IMADJUST(RGB1,...) は,RGB イメージ RGB1 RGB1 RGB1 RGB1 の各イメージ平面 (赤,緑,青)

を調整します.カラーマップの調整を行って,各平面にユニークなマッピングを適用でき

ます.

HIGH_OUT < LOW_OUT HIGH_OUT < LOW_OUT HIGH_OUT < LOW_OUT HIGH_OUT < LOW_OUT の場合,出力イメージは逆になることに注意してください.す

なわち,写真のような変換のようになります.

例題) rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');

rgbs = imresrgbs = imresrgbs = imresrgbs = imresize(rgb,0.5);ize(rgb,0.5);ize(rgb,0.5);ize(rgb,0.5);

I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);

J = imadjust(I,[0.3 0.7],[]);J = imadjust(I,[0.3 0.7],[]);J = imadjust(I,[0.3 0.7],[]);J = imadjust(I,[0.3 0.7],[]);

figure(1),imshow(I)figure(1),imshow(I)figure(1),imshow(I)figure(1),imshow(I)

figure(2),imshow(J)figure(2),imshow(J)figure(2),imshow(J)figure(2),imshow(J)

rgb2 = imadjust(rgbs,[.2 .3 0; .6 .7 1],[]);rgb2 = imadjust(rgbs,[.2 .3 0; .6 .7 1],[]);rgb2 = imadjust(rgbs,[.2 .3 0; .6 .7 1],[]);rgb2 = imadjust(rgbs,[.2 .3 0; .6 .7 1],[]);

figure(3),imshow(rgbs)figure(3),imshow(rgbs)figure(3),imshow(rgbs)figure(3),imshow(rgbs)

figure(4), imshow(rgb2)figure(4), imshow(rgb2)figure(4), imshow(rgb2)figure(4), imshow(rgb2)

Page 34: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

34

ヒストグラム均等化関数:histeq.mhisteq.mhisteq.mhisteq.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help histeq>> help histeq>> help histeq>> help histeq

HISTEQHISTEQHISTEQHISTEQ ヒストグラムの均等化を使ってコントラストを強調

HISTEQHISTEQHISTEQHISTEQ は,強度イメージの値,または,インデックス付きイメージのカラーマップの値

を,出力イメージのヒストグラムが設定したヒストグラムに近似的に一致するように変換

することにより,イメージのコントラストを強調します.

J = HISTEQ(I,HGRAM)J = HISTEQ(I,HGRAM)J = HISTEQ(I,HGRAM)J = HISTEQ(I,HGRAM) は,length(HGRAM)length(HGRAM)length(HGRAM)length(HGRAM) 個のビンをもつ出力イメージ JJJJのヒスト

グラムが,近似的に HGRAMHGRAMHGRAMHGRAM と一致するように,強度イメージ I I I I を変換します.ベクト

ル HGRAMHGRAMHGRAMHGRAM は,適切な範囲(クラス double では[0,1],クラス uint8 では[0,255],クラ

ス uint16 では[0,65535])中で,強度値をもつ等間隔に分布したビンに対する整数カウント

を含んでいます.HISTEQHISTEQHISTEQHISTEQ は,sum(HGRAM) = prod(size(I))sum(HGRAM) = prod(size(I))sum(HGRAM) = prod(size(I))sum(HGRAM) = prod(size(I)) となるように,自動的にス

ケーリングを行います.JJJJ のヒストグラムは,length(HGRAM)length(HGRAM)length(HGRAM)length(HGRAM) が IIII の離散レベル数より

も小さいときに HGRAM HGRAM HGRAM HGRAM と一致度が高まります.

J = HISTEQ(I,N)J = HISTEQ(I,N)J = HISTEQ(I,N)J = HISTEQ(I,N) は,強度イメージ IIII を変換して,NNNN 個の離散レベルをもつ強度イメー

ジとして JJJJ に出力します.ピクセルの中で大まかに等しいと思われる数値は,J J J J のヒスト

グラムが近似的にフラットになるように,JJJJ の中の NNNN レベルに分割されたものの各々にマ

Page 35: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

35

ッピングされます(JJJJ のヒストグラムは,NNNN が I の中の離散レベル数より少ないときに,

よりフラットになります).NNNN のデフォルト値は,64です.

[J,T] = HISTEQ(I)[J,T] = HISTEQ(I)[J,T] = HISTEQ(I)[J,T] = HISTEQ(I) は,強度イメージ IIII のグレーレベルを JJJJ のグレーレベルにマッピング

するグレースケール変換を出力します.

NEWMAP = HISTEQ(X,MAP,HGRAM) NEWMAP = HISTEQ(X,MAP,HGRAM) NEWMAP = HISTEQ(X,MAP,HGRAM) NEWMAP = HISTEQ(X,MAP,HGRAM) は,インデックス付きイメージ (X,NEWMAP)(X,NEWMAP)(X,NEWMAP)(X,NEWMAP)

のグレー成分のヒストグラムが,HGRAMHGRAMHGRAMHGRAM に近似的に一致するようにインデックス付きイ

メージ X に関連したカラーマップを変換します.HISTEQ HISTEQ HISTEQ HISTEQ は,NEWMAP NEWMAP NEWMAP NEWMAP に変換された

カラーマップを出力します.length(HGRAM)length(HGRAM)length(HGRAM)length(HGRAM) は,size(MAP,1)size(MAP,1)size(MAP,1)size(MAP,1) と一致しなければなりま

せん.

NEWMAP = HISTEQ(X,MAP) NEWMAP = HISTEQ(X,MAP) NEWMAP = HISTEQ(X,MAP) NEWMAP = HISTEQ(X,MAP) は,インデックス付きイメージ XXXX のグレー成分のヒスト

グラムが近似的にフラットになるようにカラーマップの値を変換します.変換されたカラ

ーマップは,NEWMAPNEWMAPNEWMAPNEWMAP に出力されます.

[NEWMAP,T] = HISTEQ(X,...) [NEWMAP,T] = HISTEQ(X,...) [NEWMAP,T] = HISTEQ(X,...) [NEWMAP,T] = HISTEQ(X,...) は,MAP MAP MAP MAP のグレー成分を NEWMAPNEWMAPNEWMAPNEWMAP のグレー成分にマ

ッピングするようにグレースケール変換を出力します.

例題) rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');

rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);

I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);

J = hJ = hJ = hJ = histeq(I);isteq(I);isteq(I);isteq(I);

figure(1),imshow(I)figure(1),imshow(I)figure(1),imshow(I)figure(1),imshow(I)

figure(2),imshow(J)figure(2),imshow(J)figure(2),imshow(J)figure(2),imshow(J)

Page 36: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

36

ノイズ生成関数:imnoise.mimnoise.mimnoise.mimnoise.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help imnoise>> help imnoise>> help imnoise>> help imnoise

IMNOISEIMNOISEIMNOISEIMNOISE イメージにノイズを付加

J = IMNOISE(I,TYPE,...)J = IMNOISE(I,TYPE,...)J = IMNOISE(I,TYPE,...)J = IMNOISE(I,TYPE,...) は,強度イメージ IIII に TYPE TYPE TYPE TYPE で設定したノイズを付加します.

TYPETYPETYPETYPE には,つぎのいずれかを設定することができます.

'gaussian 'gaussian 'gaussian 'gaussian' ' ' ' 一様の平均と分散をもつガウス白色ノイズ

'localvar' 'localvar' 'localvar' 'localvar' 強度に依存した分散をもつ平均がゼロの Gaussian白色ノイズ

'poisson' 'poisson' 'poisson' 'poisson' Poisson noise

'salt & pepper' 'salt & pepper' 'salt & pepper' 'salt & pepper' ピクセルの on と off の混在したノイズ

'speckle' 'speckle' 'speckle' 'speckle' 累積的なノイズ

TYPETYPETYPETYPE に基づいて,IMNOISEIMNOISEIMNOISEIMNOISE に追加のパラメータを設定することができます.すべての

数値パラメータは正規化されています.これらは,0 から 1 の強度の範囲をもつイメージ

への演算に対応したものです.

J = IMNOISE(I,'gaussian',M,V) J = IMNOISE(I,'gaussian',M,V) J = IMNOISE(I,'gaussian',M,V) J = IMNOISE(I,'gaussian',M,V) は,イメージ I I I I に平均値 MMMM,分散 V V V V のガウス白色ノイ

ズを付加します.デフォルト値は,VVVV は 0.01で,MMMM は 0です.

J = imnoise(I,'localvar',V)J = imnoise(I,'localvar',V)J = imnoise(I,'localvar',V)J = imnoise(I,'localvar',V) は,イメージ I I I I に,平均値 0,局所的なガウス白色ノイズ VVVV を

加えます.VVVV は,I と同じサイズの配列です.

J = imnoise(I,'localvarJ = imnoise(I,'localvarJ = imnoise(I,'localvarJ = imnoise(I,'localvar',IMAGE_INTENSITY,VAR) ',IMAGE_INTENSITY,VAR) ',IMAGE_INTENSITY,VAR) ',IMAGE_INTENSITY,VAR) は,イメージ IIII にゼロ平均,ガウス

ノイズを加えます.ここで,ノイズのローカル分散は,I のイメージの強度値の関数です.

IMAGE_INTENSITYIMAGE_INTENSITYIMAGE_INTENSITYIMAGE_INTENSITY と VARVARVARVAR は , 同 じ サ イ ズ の ベ ク ト ル で ,

PLOT(IMAGE_INTENSITY,VAR)PLOT(IMAGE_INTENSITY,VAR)PLOT(IMAGE_INTENSITY,VAR)PLOT(IMAGE_INTENSITY,VAR) は,ノイズの分散とイメージ強度の関数関係をプロッ

ト表示します.IMAGE_INTENSITY IMAGE_INTENSITY IMAGE_INTENSITY IMAGE_INTENSITY は,0と 1の範囲の正規化された強度値です.

J = IMNOISE(I,'poisson') J = IMNOISE(I,'poisson') J = IMNOISE(I,'poisson') J = IMNOISE(I,'poisson') は,データに人工的なノイズを加えるのではなく,データから

Poisson ノイズを作成します.Poisson 統計量については,uint8 や uint16 のイメージ

の強度は,フォトンの数に対応しているとします.倍精度のイメージは,ピクセルあたり

のフォトンの数 65535 より多い場合に使われます.すなわち,強度値は,0 と 1 の間で

変化する強度値で,10^12 で除算したフォトンの数に対応します.

J = IMNOISE(I,'salt & pepper',D)J = IMNOISE(I,'salt & pepper',D)J = IMNOISE(I,'salt & pepper',D)J = IMNOISE(I,'salt & pepper',D) は,イメージ IIIIに胡麻塩ノイズを付加します.ここで,

DDDD はノイズ密度です.これは,近似的に,D*PROD(SIZE(I))D*PROD(SIZE(I))D*PROD(SIZE(I))D*PROD(SIZE(I)) ピクセルに影響を与えます.

デフォルト値は,0.05ノイズ密度です.

Page 37: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

37

J = IMNOISE(I,'speckle',V)J = IMNOISE(I,'speckle',V)J = IMNOISE(I,'speckle',V)J = IMNOISE(I,'speckle',V) は,イメージ IIII に累積ノイズを付加します.ここでは,式 J J J J

= I+n*I = I+n*I = I+n*I = I+n*I を使います.ここで,nnnn は,平均が 0,分散が VVVV の一様分布乱数です.VVVV に対す

るデフォルトは 0.04です.

メディアンフィルタ関数:medfilt.mmedfilt.mmedfilt.mmedfilt.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help me>> help me>> help me>> help medfilt2dfilt2dfilt2dfilt2

MEDFILT2MEDFILT2MEDFILT2MEDFILT2 2次元のメディアンフィルタリング

B = MEDFILT2(A,[M N])B = MEDFILT2(A,[M N])B = MEDFILT2(A,[M N])B = MEDFILT2(A,[M N]) は,行列 A A A A に 2次元のメディアンフィルタリングを実行します.

各出力ピクセルには,入力イメージの対応するピクセル周囲の MMMM 行 NNNN 列の近傍の中央値

を設定します.MEDFILT2MEDFILT2MEDFILT2MEDFILT2 は,エッジの上に 0を付加するので,エッジの[M N]/2[M N]/2[M N]/2[M N]/2範囲内

の点に対する中央値は歪んでみえる可能性があります.

B = MEDFILT2(A) B = MEDFILT2(A) B = MEDFILT2(A) B = MEDFILT2(A) は,デフォルトの 3行 3列の近傍を使って,行列 A A A A にメディアンフィ

ルタリングを行います.

B = MEDFILT2(...,PADOPT) B = MEDFILT2(...,PADOPT) B = MEDFILT2(...,PADOPT) B = MEDFILT2(...,PADOPT) は,どのように行列の境界を付加するかを制御します.

PADOPTPADOPTPADOPTPADOPT には, 'zeros''zeros''zeros''zeros'(デフォルト),'symmetric''symmetric''symmetric''symmetric',または, 'indexed''indexed''indexed''indexed' を設定できます.

PADOPTPADOPTPADOPTPADOPT が 'zeros''zeros''zeros''zeros' の場合,AAAA の境界には 0 が付加されます.PADOPTPADOPTPADOPTPADOPT が 'symmetric' 'symmetric' 'symmetric' 'symmetric'

の場合,AAAA の境界で対称的に拡張されます.PADOPTPADOPTPADOPTPADOPT が 'indexed''indexed''indexed''indexed' で,かつ,AAAA が double double double double

の場合,1が付加されます.doubledoubledoubledouble 以外の場合,0が付加されます.

例題)imnoiseで胡麻塩ノイズをいれた画像を平均値フィルタとメディアンフィルタを用い

てノイズ除去を行う.

rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');rgb = imread('winter.jpg');

rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);rgbs = imresize(rgb,0.5);

I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);I = rgb2gray(rgbs);

InInInIn = imnoise(I,'salt & pepper',0. = imnoise(I,'salt & pepper',0. = imnoise(I,'salt & pepper',0. = imnoise(I,'salt & pepper',0.2);2);2);2);

subplot(2,2,1),imshow(I)subplot(2,2,1),imshow(I)subplot(2,2,1),imshow(I)subplot(2,2,1),imshow(I)

subplot(2,2,2),imshow(In)subplot(2,2,2),imshow(In)subplot(2,2,2),imshow(In)subplot(2,2,2),imshow(In)

Inav = filter2(fspeciaInav = filter2(fspeciaInav = filter2(fspeciaInav = filter2(fspecial('average',3),I)/255;l('average',3),I)/255;l('average',3),I)/255;l('average',3),I)/255;

Inmed = medfilt2(In,[3 3]);Inmed = medfilt2(In,[3 3]);Inmed = medfilt2(In,[3 3]);Inmed = medfilt2(In,[3 3]);

subplot(2,2,3),imshow(Inav)subplot(2,2,3),imshow(Inav)subplot(2,2,3),imshow(Inav)subplot(2,2,3),imshow(Inav)

subplot(2,2,4),imshow(Inmed)subplot(2,2,4),imshow(Inmed)subplot(2,2,4),imshow(Inmed)subplot(2,2,4),imshow(Inmed)

Page 38: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

38

ベクトル場矢印表示関数:quiver.mquiver.mquiver.mquiver.m

MATLABの Command Windowのヘルプ表示は次のとおりである.

>> help quiver>> help quiver>> help quiver>> help quiver

QUIVERQUIVERQUIVERQUIVER Quiverプロット

QUIVER(X,Y,U,V)QUIVER(X,Y,U,V)QUIVER(X,Y,U,V)QUIVER(X,Y,U,V) は,点(x,y)で成分(u,v)をもつ矢印として,速度ベクトルをプロットし

ます.行列 X,Y,U,VX,Y,U,VX,Y,U,VX,Y,U,V は,すべて同じサイズで,対応する位置と速度成分を含まなければな

りません(XXXX と YYYY は,一定のグリッドを指定するベクトルでも構いません).QUIVER QUIVER QUIVER QUIVER は,

グリッドに適合するように,自動的に矢印をスケーリングします.

QUIVER(U,V) QUIVER(U,V) QUIVER(U,V) QUIVER(U,V) は,xy平面上の等間隔の点で,速度ベクトルをプロットします.

QUIVER(U,V,S)QUIVER(U,V,S)QUIVER(U,V,S)QUIVER(U,V,S) または QUIVER(X,Y,U,V,S) QUIVER(X,Y,U,V,S) QUIVER(X,Y,U,V,S) QUIVER(X,Y,U,V,S) は,グリッド内に適合するように,自動的

に矢印をスケーリングし,その後それらを SSSS 倍に拡大します.自動スケーリングを行わず

に矢印をプロットするためには,S = 0 S = 0 S = 0 S = 0 を使ってください.

QUIVER(...,LINESPEC) QUIVER(...,LINESPEC) QUIVER(...,LINESPEC) QUIVER(...,LINESPEC) は,速度ベクトルに対して,指定されたラインスタイルを使用し

ます.矢印の先端の代わりに,LINESPECLINESPECLINESPECLINESPECのマーカが描画されます.マーカを設定しない

ようにするには,'.' を使用してください,使用可能な他の値については,PLOT PLOT PLOT PLOT を参照し

てください.

QUIVER(...,'filled')QUIVER(...,'filled')QUIVER(...,'filled')QUIVER(...,'filled') は,指定したマーカを塗りつぶします.

H = QUIVER(...) H = QUIVER(...) H = QUIVER(...) H = QUIVER(...) は,lineオブジェクトのハンドル番号からなるベクトルを出力します.

Page 39: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

39

例題) [x,y] = meshgrid([x,y] = meshgrid([x,y] = meshgrid([x,y] = meshgrid(----2:.2:2,2:.2:2,2:.2:2,2:.2:2,----1:.15:1);1:.15:1);1:.15:1);1:.15:1);

z = x .* exp(z = x .* exp(z = x .* exp(z = x .* exp(----x.^2 x.^2 x.^2 x.^2 ---- y.^2); [px,py] = gradient(z,.2,.15); y.^2); [px,py] = gradient(z,.2,.15); y.^2); [px,py] = gradient(z,.2,.15); y.^2); [px,py] = gradient(z,.2,.15);

contour(x,y,z), hold on contour(x,y,z), hold on contour(x,y,z), hold on contour(x,y,z), hold on

quiver(x,y,px,py), hold off, axis imagequiver(x,y,px,py), hold off, axis imagequiver(x,y,px,py), hold off, axis imagequiver(x,y,px,py), hold off, axis image

ここで,gradient.mgradient.mgradient.mgradient.mは勾配を求める関数であり,そのヘルプ表示はつぎのようになる.

>> help gradient>> help gradient>> help gradient>> help gradient

GRADIENT 勾配近似

[FX,FY] = GRADIENT(F)[FX,FY] = GRADIENT(F)[FX,FY] = GRADIENT(F)[FX,FY] = GRADIENT(F)は,行列 FFFF の数値勾配を出力します.FXFXFXFX は,x(列)方向の差分

dF/dxに対応します.FYFYFYFYは,y(行)方向の差分 dF/dyに対応します.各方向の間隔は,1と

仮定します.FFFFがベクトルのとき,DF = GRADIENT(F)DF = GRADIENT(F)DF = GRADIENT(F)DF = GRADIENT(F)は 1次元の勾配です.

[FX,FY] = GRADIENT(F,H)[FX,FY] = GRADIENT(F,H)[FX,FY] = GRADIENT(F,H)[FX,FY] = GRADIENT(F,H)は,HHHHがスカラのとき,各方向での間隔として使います.

[FX,FY] = GRADIENT(F,HX,HY)[FX,FY] = GRADIENT(F,HX,HY)[FX,FY] = GRADIENT(F,HX,HY)[FX,FY] = GRADIENT(F,HX,HY)は,Fが 2次元のとき,HXHXHXHXと HYHYHYHYで指定された間隔を

使います.HXHXHXHXと HHHHYYYYは,座標間の間隔を指定するためのスカラや,点の座標を指定するベ

クトルです.HXHXHXHX と HYHYHYHY がベクトルの場合,その長さは FFFF の対応する次元と一致しなけれ

ばなりません.

[FX,FY,FZ] = GRADIENT(F)[FX,FY,FZ] = GRADIENT(F)[FX,FY,FZ] = GRADIENT(F)[FX,FY,FZ] = GRADIENT(F)は,FFFFが 3次元配列のとき,FFFFの数値勾配を出力します.FZFZFZFZ

は,z方向の差分 dF/dzに対応します.GRADIENT(F,H)GRADIENT(F,H)GRADIENT(F,H)GRADIENT(F,H)は,HHHHがスカラのとき,各方向の

点間隔として使います.

[FX,FY,FZ] = GRADIENT(F,HX,HY,[FX,FY,FZ] = GRADIENT(F,HX,HY,[FX,FY,FZ] = GRADIENT(F,HX,HY,[FX,FY,FZ] = GRADIENT(F,HX,HY,HZ)HZ)HZ)HZ)は,HXHXHXHX,,,,HYHYHYHY,,,,HZHZHZHZで与えられた間隔を使います.

[FX,FY,FZ,...] = GRADIENT(F,...)[FX,FY,FZ,...] = GRADIENT(F,...)[FX,FY,FZ,...] = GRADIENT(F,...)[FX,FY,FZ,...] = GRADIENT(F,...)は,FFFFが NNNN次元のときも同様で,NNNN個の出力と,2個,

または,N+1N+1N+1N+1個の入力をもたなければなりません.

Page 40: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

40

8. MATLAB movie の取り扱い方法

MATLAB を用いると,連続的にグラフを保存することができ,それを,短いムービーとし

て再生することができる.これを行うには,2 つのステップを経る必要がある.

(1)getframe getframe getframe getframe 関数を使って,各ムービーフレームを作成する.

(2)movimovimovimovieeee 関数を使って,設定した割合で設定した回数ムービーを実行する.

一般的には,forforforfor ループの中で,getframegetframegetframegetframe を使ってムービーフレームの配列を集める.

getframegetframegetframegetframe は,つぎのフィールドをもつ構造体を出力する.

・cdatacdatacdatacdata - イメージデータで,uint8uint8uint8uint8 の行列の型.行列は,カラーマップ付きカラーシス

テムでは(高さ)行(幅)列の次元を,トゥルーカラーシステムでは(高さ)-(幅)-3 の次元をも

っている.

・colormapcolormapcolormapcolormap - カラーマップで,n 行 3 列の行列で,n はカラー数.トゥルーカラーシステ

ムでは ccccolormapolormapolormapolormap フィールドは空データ.

たとえば,ZZZZ の値をスケーリングして,peaks peaks peaks peaks 関数のアニメーション表示を行う M ファ

イルはつぎのとおりである.

Z = peaks; surf(Z); Z = peaks; surf(Z); Z = peaks; surf(Z); Z = peaks; surf(Z);

axis tightaxis tightaxis tightaxis tight

set(gca,'nextplot','replacechildren');set(gca,'nextplot','replacechildren');set(gca,'nextplot','replacechildren');set(gca,'nextplot','replacechildren');

% Record the movie% Record the movie% Record the movie% Record the movie

for j = 1:20 for j = 1:20 for j = 1:20 for j = 1:20

surf(sin(2*pi*j/20)*Z,Z) surf(sin(2*pi*j/20)*Z,Z) surf(sin(2*pi*j/20)*Z,Z) surf(sin(2*pi*j/20)*Z,Z)

F(j) = getframe; F(j) = getframe; F(j) = getframe; F(j) = getframe;

endendendend

% Play the movie twe% Play the movie twe% Play the movie twe% Play the movie twenty timesnty timesnty timesnty times

movie(F,20)movie(F,20)movie(F,20)movie(F,20)

実行結果は,次図がアニメーションとして表示される.

Page 41: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

41

次は,乱数を 2 次元平面にプロットしたもののアニメーションをつくる M ファイルであ

る.

n = 10;n = 10;n = 10;n = 10;

s = .02; s = .02; s = .02; s = .02;

%%%%フレームフレームフレームフレーム数数数数をををを設定設定設定設定しますしますしますします....

nframes = 50;nframes = 50;nframes = 50;nframes = 50;

%%%%最初最初最初最初ののののプロットプロットプロットプロットをををを作成作成作成作成しますしますしますします....

x = rand(n,1)x = rand(n,1)x = rand(n,1)x = rand(n,1)----0.5;0.5;0.5;0.5;

y = rand(n,1)y = rand(n,1)y = rand(n,1)y = rand(n,1)----0.5;0.5;0.5;0.5;

h = plot(x,y,'.');h = plot(x,y,'.');h = plot(x,y,'.');h = plot(x,y,'.');

set(h,'MarkerSize',18);set(h,'MarkerSize',18);set(h,'MarkerSize',18);set(h,'MarkerSize',18);

axis([axis([axis([axis([----1 11 11 11 1 ----1 1])1 1])1 1])1 1])

axis squareaxis squareaxis squareaxis square

grid offgrid offgrid offgrid off

%%%%ムービームービームービームービーをををを作成作成作成作成しししし,,,,getframe getframe getframe getframe をををを使使使使ってってってって各各各各フレームフレームフレームフレームをををを取取取取りりりり込込込込みますみますみますみます....

for k = 1:nframesfor k = 1:nframesfor k = 1:nframesfor k = 1:nframes

x = x + s*randn(n,1); x = x + s*randn(n,1); x = x + s*randn(n,1); x = x + s*randn(n,1);

y = y + s*randn(n,1); y = y + s*randn(n,1); y = y + s*randn(n,1); y = y + s*randn(n,1);

set(h,'XData',x,'YData',y) set(h,'XData',x,'YData',y) set(h,'XData',x,'YData',y) set(h,'XData',x,'YData',y)

M(k) = getframe; M(k) = getframe; M(k) = getframe; M(k) = getframe;

endendendend

% % % % 最後最後最後最後にににに,,,,ムービームービームービームービーをををを 30303030 回再生回再生回再生回再生しますしますしますします

movie(M,1)movie(M,1)movie(M,1)movie(M,1)

実行結果は,次図がアニメーションとして表示される.

Page 42: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

42

つぎは,FFT をプロットしたもののアニメーションである.

for k = 1:16for k = 1:16for k = 1:16for k = 1:16

plot(fft(eye(k+16))) plot(fft(eye(k+16))) plot(fft(eye(k+16))) plot(fft(eye(k+16)))

axis equal axis equal axis equal axis equal

M(k) = getframe; M(k) = getframe; M(k) = getframe; M(k) = getframe;

endendendend

movie(M,30)movie(M,30)movie(M,30)movie(M,30)

さらに,三角関数のアニメーション例である.

x=1:0.1:2;x=1:0.1:2;x=1:0.1:2;x=1:0.1:2;

y=1:0.1:2;y=1:0.1:2;y=1:0.1:2;y=1:0.1:2;

for k = 1:16for k = 1:16for k = 1:16for k = 1:16

aa=exp(k)*sin(x).*sin(y); aa=exp(k)*sin(x).*sin(y); aa=exp(k)*sin(x).*sin(y); aa=exp(k)*sin(x).*sin(y);

plot(aa) plot(aa) plot(aa) plot(aa)

axis equal axis equal axis equal axis equal

M(k M(k M(k M(k) = getframe;) = getframe;) = getframe;) = getframe;

endendendend

movie(M,30)movie(M,30)movie(M,30)movie(M,30)

Page 43: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

43

さらに,MATLAB ムービーは,AVI 形式につぎのようにして変換することができる.

movie2avi(mov,filename)movie2avi(mov,filename)movie2avi(mov,filename)movie2avi(mov,filename)

movie2avi(mov,filename,param,value,param,value...) movie2avi(mov,filename,param,value,param,value...) movie2avi(mov,filename,param,value,param,value...) movie2avi(mov,filename,param,value,param,value...)

movie2avi(mov,filename)movie2avi(mov,filename)movie2avi(mov,filename)movie2avi(mov,filename) は,MATLAB ムービー mov mov mov mov から AVI ムービー filename を作成

する.さらに,MATLAB プロットから直接 avi ファイルにエクスポートする M ファイルの例

をつぎにあげる.

aviobj = avifile('demomovie.avi','fps',5) % fps aviobj = avifile('demomovie.avi','fps',5) % fps aviobj = avifile('demomovie.avi','fps',5) % fps aviobj = avifile('demomovie.avi','fps',5) % fps --------> frames per second> frames per second> frames per second> frames per second

% produce data% produce data% produce data% produce data

for k=1:25for k=1:25for k=1:25for k=1:25

h = plot(fft(eye(k+16))); h = plot(fft(eye(k+16))); h = plot(fft(eye(k+16))); h = plot(fft(eye(k+16)));

set(h,'EraseMode','xor'); set(h,'EraseMode','xor'); set(h,'EraseMode','xor'); set(h,'EraseMode','xor');

axis equal; axis equal; axis equal; axis equal;

frame = getframe(gca); frame = getframe(gca); frame = getframe(gca); frame = getframe(gca);

aviobj = addframe(aviobj,frame); aviobj = addframe(aviobj,frame); aviobj = addframe(aviobj,frame); aviobj = addframe(aviobj,frame);

endendendend

aviobj = close(aviobj);aviobj = close(aviobj);aviobj = close(aviobj);aviobj = close(aviobj);

8. 動画データ(avi ファイル)の読み込みと処理方法

hpbvfx_b.avi という文字 A が右横に動いていく avi 動画を MATLAB に画像でーたとし

て取り込んで表示するMファイルは次のとおりである.MATLABプログラムでは,1フレ

ームずつ取り込んでいることに注意しよう.

Page 44: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

44

for i=1:15for i=1:15for i=1:15for i=1:15

mov = aviread('hpbvfx_b.avi',i); % i mov = aviread('hpbvfx_b.avi',i); % i mov = aviread('hpbvfx_b.avi',i); % i mov = aviread('hpbvfx_b.avi',i); % i----th frameth frameth frameth frame

[X,Map] [X,Map] [X,Map] [X,Map] = frame2im(mov); = frame2im(mov); = frame2im(mov); = frame2im(mov);

IMdat(:,:,i) = X; IMdat(:,:,i) = X; IMdat(:,:,i) = X; IMdat(:,:,i) = X;

% imshow(X);% imshow(X);% imshow(X);% imshow(X);

imagesc(X);colormap(gray); imagesc(X);colormap(gray); imagesc(X);colormap(gray); imagesc(X);colormap(gray);

pause pause pause pause

endendendend

この場合には,X は 64×64 の uint8 データになっているので,データ処理する際には,

double型に変換する必要がある.

課題課題課題課題::::上記の例題において,各フレームの画像データ XXXXから,Hornの本(大学院講義テキ

スト)の p.288-289の式を用いて,Xの x方向微分,y方向微分を計算せよ.さらに,2つ

のフレームデータを用いて,t方向微分を計算せよ.

9.オプティカルフロー計算

9.1 開口問題(aperture problem)

動画像は,対象物体の運動,カメラの運動,または両方の運動がある中で,時間的に連

続して撮る画像である.対象物体が静止し,カメラのみが運動しているときの動画像は,

ステレオ画像と同様に処理できる.動画像の各フレーム(frame)間の点の対応は,角

(corner)以外の点は,その近傍だけを見ても唯一には決定できない.角などの特徴点は,

過密でない限り,近傍の中から対応が見つかる.それ以外の点は,角などの動きから推定

する.特徴点の対応付けには,両眼視の場合と同じように,相関法を用いることが可能で

ある.まず,画像 1 で特徴点を中心とするウィンドウを決め,つぎに,画像2における探

索範囲を決める.一般的に探索範囲は 2 次元であり,その中の探索点を中心とするウィン

ドウとの相関をとり,その中で最も高い相関値をもつ点を対応点とする.

フレーム1

フレーム2

Page 45: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

45

9.2 オプティカルフロー(optical flow)

9.2.1 定義

ロボットがテレビカメラを用いて,まわりの環境を認識する場合,まわりの環境が静止

していてもロボットが動いている場合の画像は動画像になる.また,移動体に対する画像

はカメラが固定されていても対象が動くために動画像になる.動画像データからカメラ周

りの環境を自動認識する手法は多方面の分野に応用可能である.動画像は時間的に連続し

て撮った画像であるので,時間について微分できる.特に,オプティカルフローは,観測

者と対象との相対運動によって生じる画像の見かけの速度ベクトルを画素の値とする画像

によって表現するものであり,動画像の認識に広く使われるようになってきている.ここ

で,つぎを仮定する.

オプティカルフローの定義

画像中の点 ),( yx の時刻 tにおける明るさを ),,( tyxE とする.時刻が tから tt δ+ になった

ときに,画像中の点 ),( yx が画像中の位置 ),( yyxx δδ ++ に移動したとする.このとき,こ

の点の明るさは変わらないので,次式が成り立つ.

),,(),,( tyxEttyyxxE =+++ δδδ

テーラー展開の 1次近似より次式が得られる.

),,(),,( tyxEt

Et

y

Ey

x

ExtyxE ≈

∂∂

+∂∂

+∂∂

+ δδδ

画像中の移動速度をオプティカルフローといい,これを ),( vu とすると,次式のように表せ

る.

3次元空間の同じ点の明るさ(brightness) E(x,y,t) が隣接するフレーム間で変化しない.

E(x,y,t)

時間 t

frame1 frame2 frame3

x

y

動画像は画像面上で流れを生じる.移動前後の 2枚のフレーム内の画像のその撮影時間間

隔を微小にとって,各画像の対応点を結んだベクトルを時間間隔で割ると画像面上の速度

場できる.これをオプティカルフローという.

Page 46: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

46

tvytux δδδδ == ,

したがって,次式が成立することがわかる.

0

0

=∂∂

+∂∂

+∂∂

=∂∂

+∂∂

+∂∂

t

Ev

y

Eu

x

E

t

E

t

y

y

E

t

x

x

E

δδ

δδ

この式をオプティカルフローの基本拘束式という.動画像から得られるデータは,

t

E

y

E

x

E

∂∂

∂∂

∂∂

,,

であるので,このデータから ),( vu を求めるのが,オプティカルフロー推定問題である.1

組のデータではオプティカルフローは不定になるので,このために,拘束式を増やして,

最小 2 乗法によりオプティカルフローを推定する方法がこれまで提案されている.拘束式

を増やす方法の主なものには,つぎのようなものがある.

・ 空間的局所最適化法:ある空間領域においてオプティカルフローを一定と仮定

・ 時間的局所最適化法:ある時間領域においてオプティカルフローを一定と仮定

・ 空間的大域最適化法:オプティカルフローの空間的滑らかさを条件として付加

・ 時間的大域最適化法:オプティカルフローの時間的滑らかさを条件として付加

このような条件を付加することにより,次式のような連立代数方程式が得られる.

=

=

v

u

G

q

bq

これより最小 2乗解は次式のようになる.

bq TT GGG 1)(ˆ −=

通常は上式のバッチ処理計算により,オプティカルフローを計算する.

9.2.2 Lucas-Kanade 法

特に,空間的局所最適化法(Lucas-Kanade 法)では,つぎのようになる.ある領域 W 内

でオプティカルフローが一定であるとすると,次式が成り立つ.

b=

∈∀=++

v

uG

WyxtyxEvtyxEutyxE tyx ),(,0),,(),,(),,(

ただし,つぎのように行列は定義される.

=

=

),,(

),,(

,

),,(),,(

),,(),,( 000000

tyxE

tyxE

tyxEtyxE

tyxEtyxE

G

nnt

t

nnxnnx

xx

MMM b

Page 47: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

47

求める未知変数は u,vの 2つであり,上式の拘束条件はそれより多くあるので,次の意味で

の最小 2乗解を求める.

2

0

,

)),,(),,(),,((),(

)),(minarg(),(

tyxEvtyxEutyxEvue

vuevu

iitiiyii

n

i

x

vu

++=

=

∑=

この最小 2乗問題に対する正規方程式は

0,0 =∂∂

=∂∂

v

e

u

e

から次式のように得られる.

−=

∑∑

∑∑

=

=

==

==n

i

iitiiy

n

i

iitiix

n

i

iiy

n

i

iiyiix

n

i

iiyiix

n

i

iix

tyxEtyxE

tyxEtyxE

v

u

tyxEtyxEtyxE

tyxEtyxEtyxE

0

0

0

2

0

00

2

),,(),,(

),,(),,(

),,(),,(),,(

),,(),,(),,(

ここで,領域Wにエッジが含まれるとき,Gradientは一方向になることから,上式の左辺

の行列は逆行列を持たないことから,オプティカルフローを計算することはできないこと

に注意しよう.

例題例題例題例題))))Web サイト6)掲載のオプティカルフロー計算プログラムは次のとおりである.た

だし,つぎの 1枚の画像データ(sphere2.bmp)を擬似的に水平方向(ここでは水平方向を x

方向とみなす)へ3,垂直方向(y方向とみなす)へ2動かした画像を作り,これをつぎの

フレームの画像として,Lucas-Kanade法によりオプティカルフローを全画面よりまとめて

計算するものである.MATLAB では,Gq=b の最小 2 乗解は q=Gq=Gq=Gq=G¥¥¥¥bbbb で求めることができ

る.

% Read an image% Read an image% Read an image% Read an image

[X,Map] = imread('sphere2.bmp'); %[X,Map] = imread('sphere2.bmp'); %[X,Map] = imread('sphere2.bmp'); %[X,Map] = imread('sphere2.bmp'); %画像画像画像画像のののの読読読読みみみみ込込込込みみみみ

image = ind2gray(X,Map);image = ind2gray(X,Map);image = ind2gray(X,Map);image = ind2gray(X,Map);

subplot(1,3,1);subplot(1,3,1);subplot(1,3,1);subplot(1,3,1);

imshow(image); %imshow(image); %imshow(image); %imshow(image); %画像画像画像画像のののの表示表示表示表示

[rows, cols] = size(image); %[rows, cols] = size(image); %[rows, cols] = size(image); %[rows, cols] = size(image); % 画像画像画像画像ののののサイズサイズサイズサイズ

% Synthetic % Synthetic % Synthetic % Synthetic motion with Vx = 3 and Vy = 2motion with Vx = 3 and Vy = 2motion with Vx = 3 and Vy = 2motion with Vx = 3 and Vy = 2

im1 = image(3:rows, 4:cols);im1 = image(3:rows, 4:cols);im1 = image(3:rows, 4:cols);im1 = image(3:rows, 4:cols);

im2 = image(1:rowsim2 = image(1:rowsim2 = image(1:rowsim2 = image(1:rows----2, 1:cols2, 1:cols2, 1:cols2, 1:cols----3); %3); %3); %3); %次次次次フレームフレームフレームフレームのののの生成生成生成生成

% Grey level gradients% Grey level gradients% Grey level gradients% Grey level gradients

Page 48: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

48

avim = 0.5*(im1 + im2); % avim = 0.5*(im1 + im2); % avim = 0.5*(im1 + im2); % avim = 0.5*(im1 + im2); % 平均操作平均操作平均操作平均操作

% smsk % smsk % smsk % smsk ----> Gaussian> Gaussian> Gaussian> Gaussianローパスフィルタローパスフィルタローパスフィルタローパスフィルタのののの生成生成生成生成

% ceil(6*sigma) % ceil(6*sigma) % ceil(6*sigma) % ceil(6*sigma) ----> smsk> smsk> smsk> smskのののの行列行列行列行列ののののサイズサイズサイズサイズ

% sigma % sigma % sigma % sigma ----> Gaussian> Gaussian> Gaussian> Gaussianローパスフィルタローパスフィルタローパスフィルタローパスフィルタのののの標準偏差標準偏差標準偏差標準偏差

% sm% sm% sm% smthim thim thim thim ----> Gaussian> Gaussian> Gaussian> Gaussianローパスフィルタローパスフィルタローパスフィルタローパスフィルタをかけたをかけたをかけたをかけた画像画像画像画像

sigma = 3;sigma = 3;sigma = 3;sigma = 3;

smsk = fspecial('gaussian', ceil(6*sigma), sigma); smsk = fspecial('gaussian', ceil(6*sigma), sigma); smsk = fspecial('gaussian', ceil(6*sigma), sigma); smsk = fspecial('gaussian', ceil(6*sigma), sigma);

smthim = conv2(avim, smsk); smthim = conv2(avim, smsk); smthim = conv2(avim, smsk); smthim = conv2(avim, smsk);

hmsk = [hmsk = [hmsk = [hmsk = [----0.5 0 0.5]; % x0.5 0 0.5]; % x0.5 0 0.5]; % x0.5 0 0.5]; % x方向微分方向微分方向微分方向微分

vmsk = [vmsk = [vmsk = [vmsk = [----0.5; 0; 0.5]; % 0.5; 0; 0.5]; % 0.5; 0; 0.5]; % 0.5; 0; 0.5]; % yyyy方向微分方向微分方向微分方向微分

gx = conv2(smthim, hmsk); % smthimgx = conv2(smthim, hmsk); % smthimgx = conv2(smthim, hmsk); % smthimgx = conv2(smthim, hmsk); % smthimののののxxxx方向微分値方向微分値方向微分値方向微分値 grad_xgrad_xgrad_xgrad_x分布分布分布分布

gy = conv2(smthim, vmsgy = conv2(smthim, vmsgy = conv2(smthim, vmsgy = conv2(smthim, vmsk); % smthimk); % smthimk); % smthimk); % smthimのののの yyyy方向微分値方向微分値方向微分値方向微分値 grad_ygrad_ygrad_ygrad_y分布分布分布分布

subplot(1,3,2);subplot(1,3,2);subplot(1,3,2);subplot(1,3,2);

imshow(gx, []); % grad_ximshow(gx, []); % grad_ximshow(gx, []); % grad_ximshow(gx, []); % grad_xのののの強度画像表示強度画像表示強度画像表示強度画像表示

subplot(1,3,3);subplot(1,3,3);subplot(1,3,3);subplot(1,3,3);

imshow(gy, []); % grad_yimshow(gy, []); % grad_yimshow(gy, []); % grad_yimshow(gy, []); % grad_yのののの強度画像表示強度画像表示強度画像表示強度画像表示

% Temporal gradient% Temporal gradient% Temporal gradient% Temporal gradient

% gt % gt % gt % gt ----> t> t> t> t方向微分値方向微分値方向微分値方向微分値(im2(im2(im2(im2----im1)im1)im1)im1)にににに GaussianGaussianGaussianGaussianローバスフィルタローバスフィルタローバスフィルタローバスフィルタをかけたをかけたをかけたをかけた画像画像画像画像

gt = conv2(im2 gt = conv2(im2 gt = conv2(im2 gt = conv2(im2 ---- im1, smsk); im1, smsk); im1, smsk); im1, smsk);

imshow(gt, []); %grad_t imshow(gt, []); %grad_t imshow(gt, []); %grad_t imshow(gt, []); %grad_t のののの強度画像表示強度画像表示強度画像表示強度画像表示

% Subsample to reduce computational burden and select region of image% Subsample to reduce computational burden and select region of image% Subsample to reduce computational burden and select region of image% Subsample to reduce computational burden and select region of image

border = 5*sigma; % border = 5*sigma; % border = 5*sigma; % border = 5*sigma; % 除去除去除去除去するするするする端端端端データデータデータデータのののの大大大大きさきさきさきさ

samprate = 10; %samprate = 10; %samprate = 10; %samprate = 10; %オプティカルフローオプティカルフローオプティカルフローオプティカルフロー計算計算計算計算をするときにをするときにをするときにをするときに間引間引間引間引くくくくデータデータデータデータ間隔間隔間隔間隔

gxs = gx(1+border:samprate:rowsgxs = gx(1+border:samprate:rowsgxs = gx(1+border:samprate:rowsgxs = gx(1+border:samprate:rows----border, 1+border:samprate:colsborder, 1+border:samprate:colsborder, 1+border:samprate:colsborder, 1+border:samprate:cols----border);border);border);border);

gys = gy(1+border:samprate:rowsgys = gy(1+border:samprate:rowsgys = gy(1+border:samprate:rowsgys = gy(1+border:samprate:rows----border,border,border,border, 1+border:samprate:cols 1+border:samprate:cols 1+border:samprate:cols 1+border:samprate:cols----border);border);border);border);

gts = gt(1+border:samprate:rowsgts = gt(1+border:samprate:rowsgts = gt(1+border:samprate:rowsgts = gt(1+border:samprate:rows----border, 1+border:samprate:colsborder, 1+border:samprate:colsborder, 1+border:samprate:colsborder, 1+border:samprate:cols----border);border);border);border);

% Put gradients into matrices to solve equations% Put gradients into matrices to solve equations% Put gradients into matrices to solve equations% Put gradients into matrices to solve equations

% Gq = B% Gq = B% Gq = B% Gq = B

G = [gxs(:) gys(:)];G = [gxs(:) gys(:)];G = [gxs(:) gys(:)];G = [gxs(:) gys(:)];

B = gts(:);B = gts(:);B = gts(:);B = gts(:);

Page 49: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

49

% Solve for the velocity% Solve for the velocity% Solve for the velocity% Solve for the velocity

q = G q = G q = G q = G ¥¥¥¥ B B B B

画面全体でオプティカルフローを計算した結果がつぎである.

>>

q =

2.8548

1.8328

画像表示はつぎのようになる.

課題課題課題課題:aviファイルの 2フレームを読み込んで,Lucas-Kanade法によりオプティカルフロ

ーを計算するプログラムを上記を参考に作れ.

課題課題課題課題:Lucas-Kanade法によるオプティカルフローを計算する領域を局所的に計算して,全

領域でのオプティカルフローを計算し,quiver 関数を用いてベクトル場を画像内に表示せ

よ.

Page 50: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

50

9.2.3 Horn-Schunk 法

オプティカルフローの空間的滑らかさを条件として付加した空間的大域最適化法に

Horn-Schunk法がある.オプティカルフローの空間的滑らかさをはかる評価関数として,

次式が定義されており,この値が小さいほど滑らかであると考えられる.

dxdyy

v

x

v

y

u

x

ues

2222

∂∂

+

∂∂

+

∂∂

+

∂∂

= ∫∫

オプティカルフローの拘束式を空間的に積分した評価関数を次式で定義し,この値がゼロ

が本来の拘束式になる.

dxdyt

Ev

y

Eu

x

Eeo

2

∫∫

∂∂

+∂∂

+∂∂

=

そこで, 00 =e を拘束条件として se を最小化する問題はラグランジュ乗数法を用いて,字

式の評価関数を最小化する問題に帰着できる.

∫∫= dxdyvvuuvuFe yxyx ),,,,,(

ただし,つぎのように記号を定義している.

)()()(

,,,

2222

tyxyxyx

yxyx

EvEuEvvuuF

y

vv

x

vv

y

uu

x

uu

++++++=

∂∂

=∂∂

=∂∂

=∂∂

=

λ

これは変分法(福祉ロボット工学の解析力学の講義資料を参考にすること)を用いて,次

式のオイラー・ラグランジュ方程式が出てくる.

0,0 =∂∂

−∂∂

−=∂∂

−∂∂

−yxyx vvvuuu F

yF

xFF

yF

xF

画像データは通常は離散であるので,これを離散系の最小化問題に変形すると,つぎの

ようになる.(i,j)ピクセルにおける空間的な滑らかさは次式で計算できる.

( ) ( ) ( ) ( ) 2,1,

2

,,1

2

,1,

2

,,1,4

1jijijijijijijijiji vvvvuuuus −+−+−+−= ++++

さらに,オプティカルフロー拘束式は次式となる.

( )2,,, tjiyjixji EvEuEc ++=

ここで, tyx EEE ,, の計算式は後で述べる.オプティカルフローを求める問題は,次式の評

価関数を最小化する問題に帰着される.

∑∑ +==i j

jijivuvu

csevu )(minargminarg),( ,,,,

λ

Page 51: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

51

ただし,λ はラグランジュの未定乗数である.これは,つぎの 3条件に帰着される.

),(;0,0,0,,

lke

u

e

u

e

lklk

∀=∂∂

=∂∂

=∂∂

λ

3番目の式はオプティカルフローの拘束式に一致し,残りの 2つの式はつぎのようになる.

( )

( )

( )

( ) 02)(2

2)(2)(2

)1)((2)1)((2

4

1

02)(2

2)(2)(2

)1)((2)1)((2

4

1

,,,,

,,

1,,,1,

,1,,,1

,,,,

,,

1,,,1,

,1,,,1

=+++−=

+++

−+−+

−−+−−=

∂∂

=+++−=

+++

−+−+

−−+−−=

∂∂

−−

++

−−

++

ytlkylkxlklk

ytlkylkx

lklklklk

lklklklk

kl

xtlkylkxlklk

xtlkylkx

lklklklk

lklklklk

kl

EEvEuEvv

EEvEuEvvvv

vvvv

u

e

EEvEuEuu

EEvEuEuuuu

uuuu

u

e

λ

λ

λ

λ

ただし, lklk vu ,, , は局所的平均であり,次式で与えられる.

( )

( )1,,11,,1,

1,,11,,1,

4

1

4

1

−−++

−−++

+++=

+++=

lklklklklk

lklklklklk

vvvvv

uuuuu

これはつぎのようにまとめられる.

−=

+

+

tylk

txlk

lk

lk

yyx

yxx

EEv

EEu

v

u

EEE

EEE

λλ

λλλλ

,

,

,

,

2

2

1

1

これから次式が得られる.

ytlkylkx

yx

lk

txlkylkyx

yx

lk

tylkxlkxy

yx

lk

xtlkylkx

yx

lk

txlkyxlkx

yx

lk

txlkyxlky

yx

lk

EEvEuEEE

v

EEvEuEEEE

v

EEvEuEEEE

v

EEvEuEEE

u

EEvEEuEEE

u

EEvEEuEEE

u

++++

−=

++++

−=

−++−++

=

++++

−=

++++

−=

−−+++

=

,,22,

,

2

,22,

,

2

,22,

,,22,

,,

2

22,

,,

2

22,

)(1

)(1

)1()(1

1

)(1

)(1

)1()(1

1

λλ

λλ

λλλλ

λλ

λλ

λλλλ

これは対象点の近傍のオプティカルフローの平均値を指定することにより,対象点のオプ

Page 52: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

52

ティカルフローを計算することができることを意味している.上式右辺第 2 項の成分が対

象点のオプティカルフローへの修正項を意味しており,これはベクトル

=∇

y

x

E

EE の方向

であることがわかる.また, tyx EEE ,, はつぎのようにして計算できる.

( )

( )

( )

( )

( )

( )kjikjikjikji

kjikjikjikjit

kjikjikjikji

kjikjikjikjiy

kjikjikjikji

kjikjikjikjix

EEEEt

EEEEt

E

EEEEy

EEEEy

E

EEEEx

EEEEx

E

,1,1,,1,1,,,

1,1,11,,11,1,1,,

1,,1,,11,,,,

1,1,1,1,11,1,,1,

1,1,,1,1,,,,

1,1,1,1,11,,1,,1

4

14

1

4

1

4

14

14

1

++++

++++++++

++++

++++++++

++++

++++++++

+++−

+++=

+++−

+++=

+++−

+++=

δ

δ

δ

δ

δ

δ

課題課題課題課題:Horn-Schunk法をMATLABコードで記述せよ.

9.3 アファインフロー(Affine flow)

オプティカルフローを計算する際には,領域内でのフローを一定と仮定しているが,フ

ローが場所に依存する場合も考えられる.特に,フローが次式のアファイン関係を満たす

ように仮定すると,フロー一定の場合を容易に拡張することができる.

feydxv

cbyaxu

++=

++=

このとき,オプティカルフローを求めることは,つぎのようにパラメータ a,b,c,d,e,fを求め

る最小 2乗問題に帰着できる.

2

0

,,,,,

)),,())(,,())(,,((),(

)),(minarg(),,,,,(

tyxEfeydxtyxEcbyaxtyxEvue

vuefedcba

iitiiyii

n

i

x

fedcba

++++++=

=

∑=

このときの解は次式のようになる.

Page 53: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

53

n1−=

M

f

e

d

c

b

a

ただし,つぎのように行列とベクトルは定義されている.

=

=

∑∑∑∑∑∑

∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑

tx

tx

tx

tx

tx

tx

y

yy

yyy

yxyxyxx

yxyxyxxx

yxyxyxxxx

EE

EyE

ExE

EE

EyE

ExE

E

yEEy

xExyEEx

EEEyEExEE

EyEEEyExyEyEEy

ExEExyEEExxExyEEx

M

n

2

222

2222

2

2222

22222

課題課題課題課題:アファインフローを計算するMATLABコードを記述せよ.

9.4 Motion Filed方程式

透視投影(Perspective Projection)の場合,対象物のカメラ座標と画像座標との関係は次式

で与えられる.

==

=

=

1

/

/1

11

ˆ zy

zx

zY

X

xX

X または xX =ˆz

ただし, Xは画像面の斉次座標であり,これはカメラの焦点距離を f=1 と規格化した画像

面のカメラ座標に一致する.上式を微分して変形すると,つぎのようになる.

+

=+=

0

/

/

1

ˆˆ dtdY

dtdX

zY

X

dt

dz

dt

dz

dt

dz

dt

d XX

x

ここで,対象物の 3 次元運動の速度を v,z 軸(奥行き)方向単位ベクトルをkと書くと,

Page 54: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

54

次式のようになる.

[ ]

==•=

=

=

1

0

0

///

1

0

0

dtdzdtdydtdxdt

dz

dt

d

Tkvkv

k

xv

ここで, kv • はベクトルの内積を意味している.また,画像面上の速度を oV とおくと,

次式の関係が得られる.

=

0

/

/

ˆ dtdY

dtdX

oV

これらを用いると,次式が得られる.

0ˆˆ)( VXkvv z+•=

これから,オプティカルフローは3D速度を用いて次式のように表せることがわかる.

( ) XkvvV ˆ1ˆ0 •−=

z

これを要素で書くと,つぎのようになる.

nn

nn

zYyz

zYy

dt

dY

zXxz

zXx

dt

dX

&&&&

&&&&

−=−

=

−=−

=

ただし,つぎのようにおいている.

z

zz

z

yy

z

xx nnn

&&

&&

&& === ,,

この式は3D 運動速度場と画像面速度場の関係を表すもので,Motion Field 方程式を呼ば

れる.つぎのような性質が成り立つことがわかる.

・画像面速度場からは,奥行きや 3D運動速度場を別々に決定することはできず, nnn zyx &&& ,,

をのみ決定できる.

・Motion Fieldは奥行き zに反比例するので,接近するほど,はやく移動する.

・Motion Fieldは Xとともに増えるので,中心から遠いほど,はやく動く.

Page 55: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

55

課題課題課題課題:3D速度場を適当な関数により与え,その画像面速度場をMATLABを用いて表示せ

よ.

9.5 Focus of Expansion

並進運動の場合,画像面上の運動ベクトルは 1 点で交わり,この点を focus of expansion

(FOE)という.この点 FOEFOE YX , は運動ベクトルをゼロとおくことにより,求めることがで

きる. 0≠z& のとき,

z

yYzYy

z

xXzXx

FOEFOE

FOEFOE

&

&&&

&

&&&

=⇒−=

=⇒−=

0

0

0=z& のとき,FOE は無限遠で運動ベクトルは平行になる.

9.6 対象の動きの表現

並進と回転の両方の運動をする場合の剛体の運動場について一般論を展開する.

仮定)対象は剛体(rigid body)とする.

基本原理)前方を移動する対象物体を固定したカメラで捉える場合を考える.カメラで,

移動前と移動後のそれぞれの画像をとらえるとし,両画像での対応する点は検出できるも

のとする.ある 1点に注目する.

移動前の点:

=

z

y

x

x ,<--( 原点まわりの回転R+ 平行移動 t )--移動後の点:

=′

z

y

x

x

--(原点まわりの回転TR + 平行移動 t

TR− ) txx +=′ R

Rは直交行列,つまり, IRRT = であるので,回転行列の自由度は要素の数9から制約式

の数6を引いた3である.また,平行移動の自由度は3であるので,空間を移動する自由

度は全部で6である.動画像では,奥行き方向の大きさが決定できないことからスケール

nn

nn

zYyz

zYy

dt

dY

zXxz

zXx

dt

dX

&&&&

&&&&

−=−

=

−=−

=

Page 56: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

56

分の 1自由度が残るので,運動のパラメータの自由度は5になる.実際に,tについてはそ

の方向だけがきまり,空間での絶対的な移動量の大きさは決定できないことになる.そこ

で,以下では, tを単位ベクトルとする.

9.7 回転の表現

回転行列の具体的表現を導出する.x 軸まわりに角度α ,つぎに y 軸まわりに β ,さら

に z軸まわりにγ だけ回転する回転行列は次式のようになる.

+−+

++−

=

=

βαβαβγβαγαγβαγαγβγβαγαγβαγαγβ

αααα

ββ

ββγγγγ

coscoscossinsin

sinsincoscossinsinsinsincoscossincos

cossincossinsincossinsinsincoscoscos

cossin0

sincos0

001

cos0sin

010

sin0cos

100

0cossin

0sincos

R

9.8 微小回転の表現

前式において回転角 γβα ,, が微小量 γβα ddd ,, であるとすると,つぎのような近似が可

能である.

0)sin()sin(,0)sin()sin(,0)sin()sin(

)sin(,)sin(,)sin(

1)cos()cos()cos(

===

===

===

γβγαβαγγββαα

γβα

dddddd

dddddd

ddd

このとき,回転行列は次式のようになる.

=

1

1

1

αβαγβγ

dd

dd

dd

dR

微小な回転

=

γβα

d

d

d

dω と微小な平行移動 td により,点xが点 xxx d+=′ に移動したとする

と,次式が成り立つ.

txωxttxxx ddd

xdydz

zdxdy

ydzdx

ddRd +×+=+

−+

−+

−+

=+=+

))()((

))()((

))()((

)(

βααγγβ

これから微小変位は次式で与えられる.

xωtx ×+= ddd

Page 57: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

57

9.9 運動パラメータとオプティカルフロー

オプティカルフローから 3次元形状を復元することができる.対象が移動する場合でも,

対象が静止していてカメラが移動するとしても実質的に同じと考えられるので,ここでは,

対象が固定されていて,カメラが動いている場合を考える.

カメラの平行移動量を tttt,平行移動速度を VVVV,カメラのカメラ座標軸周りの回転角速度をΩΩΩΩ

とする.

==

Ω

Ω

Ω

==

=

=

dt

ddt

ddt

d

dt

d

dt

dtdt

dtdt

dt

dt

d

V

V

V

t

t

t

z

y

x

z

y

x

z

y

x

z

y

x

γ

β

α

ωtVt ,,

カメラの移動によって,点 Pのカメラ座標 xxxx=(x,y,z)が xxxx+dxdxdxdx=(x,dx,y+dy,z+dz)へ移動したと

する.これは,カメラが固定されているとみなすと,点 Pが速度----VVVVで平行移動し,回転角

速度----ΩΩΩΩで回転運動したことに相当する.前述の微小変位の式から,次式が成り立つ.

xΩVx

×−−=dt

d

上式が対象物の運動を表す非線形状態方程式(運動学モデル)である. これは次のように

書きなおすことができる.

ΩΩ−

Ω−Ω

ΩΩ−

−=

z

y

x

xy

xz

yz

V

V

V

z

y

x

z

y

x

0

0

0

&

&

&

また,カメラ座標3D速度と画像面速度には次式のような関係が成り立つ.

z

Y

X P

カメラ

対象

y

x (x,y,z):カメラ座標

(X,Y):画像座標

Page 58: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

58

z

zYy

dt

dYz

zXx

dt

dX

&&

&&

−=

−=

この2つの式から次式が導かれる.

xyz

zx

y

xyzz

yx

YXYz

VYX

z

V

dt

dY

XYXYz

VX

z

V

dt

dX

Ω+Ω−+Ω+

Ω+−=

Ω+Ω−Ω++

Ω+−=

2

2

この式はカメラの運動とオプティカルフローと対象の形状を結びつける式になっている.

ここで,カメラの並進運動 Vと回転運動Ωをまとめて,

Ω

Ω

Ω=

z

y

x

z

y

x

V

V

V

T

とおき,カメラの運動パラメータ(camera motion parameters)と呼ぶと,上式は次式のよ

うになる.

TTTL

XXYYzYz

YXXYzXz

Y

X

dt

d=

−−+−

−−−=

2

2

1//10

1/0/1

この式から,つぎのことがわかる.

・3次元形状の復元は,各点の奥行き zを求めることであるが,オプティカルフローからは

奥行きは平行移動速度成分との比でしか知ることができない.ここに,スケール分の曖昧

さが残ることになる.

・オプティカルフローと奥行きzが与えられるとき,上式は V,Ωに関して線形になり,最

小 2乗法からカメラ運動 V,Ωを推定することができる.

・オプティカルフローが与えられ,カメラ運動 V,Ωが既知であるならば,奥行きzを決定

することができる.

たとえば,奥行きの変化がカメラまでの距離に比較して小さいとき,zは一定であるとみ

なすことができる.このとき,オプティカルフローは画像面座標の 2 次関数として,次式

のように書くことができる.

Page 59: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

59

++++

++++=

2

2

hYgXYfYeXd

hXYgXcYbXa

Y

X

dt

d

これはアファインフローをさらに一般化したものになっていることがわかる.

また,並進速度がゼロ,V=0,の場合には,奥行きの割り算がなくなり,次式のようにな

る.

Ω+Ω−Ω−Ω−

Ω+Ω−Ω+Ω−=

xyzx

Xyzy

YXYX

XYXY

Y

X

dt

d2

2

課題課題課題課題:運動パラメータを適当に与えて対象物の運動を表す非線形状態方程式(運動学モデ

ル)を解いて,3D運動およびその画像座標を計算し,画像として出力するMATLABコー

ドあるいは SIMULINKモデルを書け.

課題課題課題課題:アファインフローと同様にして,このページの一番上の式からオプティカルフロー

を求める最小 2乗解を求め,MATLABコードを記述せよ.

9.10 Vision-Based Control

空間に多数の点,

Nizyx iiii ,,2,1);,,( L==x

があり,これらの画像の座標が,

NiYX ii L,2,1);,( =

であるとする.これらをまとめてつぎのベクトルとする.

=

M

2

2

1

1

Y

X

Y

X

f

このとき,次式が成り立つ.

Page 60: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

60

−−+−

−−−

−−+−

−−−

=

=

MMMMMM

222

2

2222

2

2

222222

111

2

1111

1

2

111111

1//10

1/0/1

1//10

1/0/1

XYXYzYz

YXYXzXz

XYXYzYz

YXYXzXz

L

Ldt

d

T

N

T

N Tf

そこで, gf をカメラがゴール位置にあるときの画像座標の集合を表しているとする.

Vision-Based Controlは,画像上の各点がゴール画像に向かって動く,つまり,

0)( →−− gdt

dff

f

となるように制御する方法である.このようなカメラ運動パラメータは次式で与えられる.

)( g

TL ffT −−= +λ

ただし, 10 << λ であり,+TL は

TL の左擬似逆行列,つまり, ILL TT =+となる行列であ

る.

9.11 ディジタルカルマンフィルタを用いたカメラの運動パラメータ推定法

前述したように,カメラの運動を表す非線形状態方程式(運動学モデル)は次式である.

Ω−Ω

ΩΩ−

Ω−Ω

=

z

y

x

xy

xz

yz

V

V

V

z

y

x

z

y

x

0

0

0

&

&

&

動画データは離散時間の画像フレームの集合であるので,上式を k フレームと k-1 フレー

ムを用いて離散化すると,次式のようになる.

Ω−Ω

ΩΩ−

Ω−Ω

=

−−

−−

−−

1,

1,

1,

1

1

1

1,1,

1,1,

1,1,

1

1

1

0

0

0

kz

ky

kx

k

k

k

kxky

kxkz

kykz

kk

kk

kk

V

V

V

z

y

x

zz

yy

xx

これから次式のような時変型離散時間状態方程式が得られる.

Ω−Ω

ΩΩ−

Ω−Ω

=

−=

−−

−−

−−

−−−

1

1

1

1,1,

1,1,

1,1,

1

111

kxky

kxkz

kykz

k

kkkk

F

F Vxx

Page 61: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

61

ここで,画像に量子化誤差がある場合には,それを用いて算出したカメラの運動パラメー

タにも誤差が含まれる.カメラの運動パラメータ誤差を kk dTT

x

∂とすると次式が成り立つ.

11

111 −−

−−− ∂

∂+−= k

kkkkk dF T

T

xVxx

ここで,新しい変数をつぎのように定義する.

1

1,

1,

1,

1

0

0

0−

− +

= k

kz

ky

kx

k dV

V

V

Tw

この変数の平均と分散は, 1−kdT の平均をゼロと仮定すると,次式のようになる.

[ ]

[ ] [ ] [ ]111

1,

1,

1,

1

VarVarVar

0

0

0

−−−

==

=

kkk

kz

ky

kx

k

d

V

V

V

E

TTw

w

これからノイズを含む離散時間状態方程式として,次式が得られる.

−−

−−

−−

=

+=

−−

−−

−−

−−−−

0100

0010

0001

11

11

11

1

1111

kk

kk

kk

k

kkkkk

xy

xz

yz

G

GF wxx

つぎに出力方程式を求める.出力は画像座標であるので,次式のようになる.

k

kk

kk

kzy

zx'

/

/uX +

=

ただし, k'u は画像上の量子化誤差である.上式を 1−kx のまわりでテイラー展開し,2次以

上の項を無視すると,次式のようになる.

11

2

111

11

2

111

////

////

−−−−−

−−−−−

+−=

+−=

kkkkkkkk

kkkkkkkk

zyzyzyzy

zxzxzxzx

Page 62: 大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料 …...大分大学工学部福祉環境工学科朊尾研究室 ゴプ資料Ver.6 1/14/2003 3 ドが起動され,自動的にMATLABの内部データとして取り込むことができる.インポートで取り込め

大分大学工学部福祉環境工学科松尾研究室 ゼミ資料 Ver.6 1/14/2003

62

ここで,

+=

−−

−−

11

11

/

/'

kk

kk

kkzy

zxuu

とおくと出力方程式は次式のようになる.

−=

+=

−−−

−−−2

111

2

111

//10

/0/1

kkk

kkk

k

kkkk

zyz

zxzH

H uxX

これより,カルマンフィルタなどの制御理論における推定器を用いることにより,画像出

力から3次元座標を推定することができる.

参考文献

1)高井信勝:「信号処理」「画像処理」のためのMATLAB入門,工学社 (2002)

2)MATLAB ver.6.5 オンラインマニュアル (2002)

3)高谷邦夫:Matlabの総合応用,森北出版 (2002)

4)B.K.P. Horn : Robot Vision, MIT Press (1986)

5)出口光一郎著:ロボットビジョンの基礎,コロナ社(2000)

6)徐,辻著:3次元ビジョン,共立出版(1998)

7)http://www.cogs.susx.ac.uk/users/davidy/acv/module2.html

8)http://www.rpi.edu/~zouj/projects.html