27
25情報処理技術講義 よる画像処理 MATLABよる画像処理2 39

MATLABによる画像処理2yamasho/old/IP2.pdfMATLABによる画像処理 画像処理の流れと分類 画像入力-画像変換-情報計測 画像処理は次元を減らすことで特徴量を抽出する

Embed Size (px)

Citation preview

第25回 情報処理技術講義

よる画像処理MATLABによる画像処理2

39

MATLABによる画像処理

画像処理の流れと分類

画像入力-画像変換-情報計測

画像処理は次元を減らすことで特徴量を抽出する

(例)

知覚色変換(HSV) 黄色領域のみを抽出入力画像

x画素階調

y画素階調

40長方形と思われるものも 視点を変えると… 特徴を抽出して調査

MATLABによる画像処理

特徴抽出領域分割二次元処理

エッジ検出(空間フィルタリング)二値画像処理

領域分割

パターンマッチング

領域分割テクスチャ解析テンプレートマッチング テクスチャ解析

三次元処理

カラーマッチング

距離変換対応点解析ステレオ再現

対応点解析

動画像処理

オプティカルフロー特 追

対応点解析

41

特徴点追尾

MATLABによる画像処理

エッジ抽出と空間フィルタリング

エッジ抽出は脳内における画像認識の基本処理である

各画素同士 畳込み積分で実現

t∆)(tf

の差除算は非常にコストがかかる

∫∞

∞−−⋅=∗ τττ dtgftgtf )()()()(

ttfttftf

∆−∆+

=′ )()()(

がかかるt∆

)(τf

2進数の減除算)(t 0

1

移動t∆

エッジは微分処理で得ることができる

を思い出して

全て加乗算

)( τ−tg

1−

0 移動

42

MATLABによる画像処理

エッジ抽出と空間フィルタリング

畳込み積分は微分以外の処理も実現可能畳込み積分は微分以外の処理も実現可能

t∆)(τf

t∆)(τf )(f

)( τ−tg3

13

13

1

移動

)(f

)( τ−tg 0

1移動

全て加乗算1− 全て加乗算

微分処理(High pass filter) 平滑処理(Low pass filter)

101101101

−−−

111000111 −−−

91

91

91

91

91

91

91

91

91

43http://www.image.med.osaka-u.ac.jp/member/yoshi/ouec_lecture/digital_processing/handout/Convolution.pdf空間フィルタリング

MATLABによる画像処理

特徴抽出 空間フィルタリング(微分)

clear allImg=imread(‘z:¥MATLAB¥character.bmp');ImgG=double(Img);

[xsize,ysize]=size(ImgG);filter=(1/3)*[-1 0 1; -1 0 1; -1 0 1]; %x方向%filter=(1/3)*[-1 -1 -1; 0 0 0; 1 1 1]; %y方向ImgOut=zeros(xsize, ysize);for i=2:xsize-1

for j=2:ysize-1temp=ImgG(i-1:i+1 j-1:j+1);temp ImgG(i 1:i+1, j 1:j+1);result=temp.*filter;ImgOut(i, j)=sum(result(:));

endendImgOut=abs(ImgOut);figure(1),subplot(1 2 1) imagesc(ImgG);axis([0 xsize 0 ysize]);

44

subplot(1,2,1), imagesc(ImgG);axis([0 xsize 0 ysize]);subplot(1,2,2), imagesc(uint8(ImgOut));axis([0 xsize 0 ysize]);colormap('gray');

MATLABによる画像処理

特徴抽出 空間フィルタリング(その他)

filter=(1/9)*[1 1 1; 1 1 1; 1 1 1];平滑化

細線化

filter=(1/3)*[1 1 1; 1 1 1; 1 1 1];細線化

filter=(1/4)*[0 1 0; 1 -4 1; 0 1 0];

ラプラシアン(2次微分)

141010

45

010

MATLABによる画像処理

特徴抽出=外乱を除去して特徴を浮立たす(画質改善)(例)CCDのパターンノイズの除去 http://www.roper.co.jp/Html/roper/tech_note/html/rp00.htm

46

MATLABによる画像処理

特徴抽出 空間フィルタリングによるノイズ除去

ノイズ画像の生成

clear allImg=imread(‘z:¥MATLAB¥Lenna.bmp');ImgG=double((0 299*Img(: : 1)+0 687*Img(: : 2)+0 114*Img(: : 3))/3);ImgG=double((0.299 Img(:,:,1)+0.687 Img(:,:,2)+0.114 Img(:,:,3))/3);[xsize,ysize]=size(ImgG);ImgNoise=ImgG;noise=rand(xsize,ysize);for i=1:xsizefor i=1:xsize

for j=1:ysizeif (noise(i,j) < 0.02)

ImgNoise(i,j)=0;endend

endendfigure(1),subplot(2 1 1) imagesc(ImgG);axis([0 xsize 0 ysize]);

エッジ抽出してみると ノイズの影響大

subplot(2,1,1), imagesc(ImgG);axis([0 xsize 0 ysize]);subplot(2,2,2), imagesc(uint8(ImgNoise));axis([0 xsize 0 ysize]);colormap('gray');

47

エッジ抽出してみると…ノイズの影響大

MATLABによる画像処理

特徴抽出 空間フィルタリングによるノイズ除去

平滑化によるノイズ除去

clear allImg=imread(‘z:¥MATLAB¥Lenna.bmp');ImgG=double((0 299*Img(: : 1)+0 687*Img(: : 2)+0 114*Img(: : 3))/3);ImgG=double((0.299 Img(:,:,1)+0.687 Img(:,:,2)+0.114 Img(:,:,3))/3);[xsize,ysize]=size(ImgG);ImgNoise=ImgG;noise=rand(xsize,ysize);for i=1:xsizefor i=1:xsize

for j=1:ysizeif (noise(i,j) < 0.02)

ImgNoise(i,j)=0;endend

endendfigure(1),subplot(2 1 1) imagesc(ImgG);axis([0 xsize 0 ysize]);

エッジ抽出してみると 完全には除去できていない

subplot(2,1,1), imagesc(ImgG);axis([0 xsize 0 ysize]);subplot(2,2,2), imagesc(uint8(ImgNoise));axis([0 xsize 0 ysize]);colormap('gray');

48

エッジ抽出してみると…完全には除去できていない

MATLABによる画像処理

特徴抽出 空間フィルタリングによるノイズ除去

メディアンフィルタによるノイズ除去

filter=[1 1 1; 1 1 1; 1 1 1]; ImgMedian=zeros(xsize, ysize);for i=2:xsize 1for i=2:xsize-1

for j=2:ysize-1temp=ImgNoise(i-1:i+1, j-1:j+1);result=temp.*filter;ImgMedian(i j)=median(result(:));ImgMedian(i, j)=median(result(:));

endendImgMedian=abs(ImgMedian);subplot(2 2 3) imagesc(uint8(ImgMedian));axis([0 xsize 0 ysize]);subplot(2,2,3), imagesc(uint8(ImgMedian));axis([0 xsize 0 ysize]);colormap('gray');

中央値を採用する=極端なノイズが除去できる(数階調ずれるような微妙なノイズは除去できない)

49

MATLABによる画像処理

特徴抽出

∫∞

畳込みとフーリエ変換

畳込み演算はフーリエ(周波数)領域で乗算として計算できる

( )∫∞

∞−

−= dtetxX tjωω)( (意味を説明できますか?)

)()()()( ωω YXtytx ⋅⇔∗)(tx

)(ωX )(ωYIFTFT

×

50

MATLABによる画像処理

特徴抽出

フーリエ領域での空間フィルタリング

フーリエ変換

51周波数的な特徴抽出が空間フィルタリングの応用として活用できる

MATLABによる画像処理

特徴抽出 周波数フィルタリング(Low Pass)

clear allImg=imread(‘z:¥MATLAB¥Lenna.bmp');ImgG=double((0.299*Img(:,:,1)+0.687*Img(:,:,2)+0.114*Img(:,:,3))/3);ImgG=ImgG/max(max(ImgG));ImgG=ImgG/max(max(ImgG));[xsize,ysize]=size(ImgG); % 2の累乗Fsize=20; %窓関数

ImgFFT=fft2(ImgG);ImgFFT=fft2(ImgG);ImgFFT=fftshift(ImgFFT);filter2D=zeros(xsize,ysize);filter2D(xsize/2-Fsize:xsize/2+Fsize, ysize/2-Fsize:ysize/2+Fsize)=1; result=filter2D *ImgFFT;result=filter2D. ImgFFT;ImgIFFT=ifft2(result);ImgIFFT=sqrt(ImgIFFT.*conj(ImgIFFT));ImgOut=ImgIFFT/max(max(ImgIFFT));

figure(1),subplot(2,2,1), imagesc(uint8(ImgG*256.0));axis([0 xsize 0 ysize]);subplot(2,2,2), imagesc(uint8(abs(ImgFFT)));axis([0 xsize 0 ysize]);subplot(2 2 3) imagesc(uint8(abs(result)));axis([0 xsize 0 ysize]);

52

subplot(2,2,3), imagesc(uint8(abs(result)));axis([0 xsize 0 ysize]);subplot(2,2,4), imagesc(uint8(ImgOut*256.0));axis([0 xsize 0 ysize]);colormap('gray');

MATLABによる画像処理

特徴抽出 周波数フィルタリング

Fsize=20; %窓関数ImgFFT=fft2(ImgG);

High pass

ImgFFT fft2(ImgG);ImgFFT=fftshift(ImgFFT);filter2D=ones(xsize,ysize);filter2D(xsize/2-Fsize:xsize/2+Fsize, ysize/2-Fsize:ysize/2+Fsize)=0;

Motion blurfilter2D=zeros(xsize,ysize); %motion blurfilter2D(1:xsize, ysize/2-Fsize/4:ysize/2+Fsize/4)=1;

53

MATLABによる画像処理

特徴抽出 周波数フィルタリング

ImgFFT=fft2(ImgG);ImgFFT=fftshift(ImgFFT);Mag=2;

Multi-sampling

Mag 2;X=zeros(2*xsize,2*ysize); for x=1:2*xsize

for y=1:2*ysize if mod(x 2)==0 && mod(y 2)==0if mod(x,2) 0 && mod(y,2) 0

oldx=(x-xsize)/Mag;oldy=(y-ysize)/Mag; oldx=oldx+xsize/2;oldy=oldy+ysize/2;oldy oldy+ysize/2; if oldx>0 & oldx<=xsize & oldy>0 & oldy<=ysize;

X(x,y)=ImgFFT(oldx,oldy);end

endendend

endScaledImgFFT=X(256-128+1:256+128, 256-128+1:256+128);ImgIFFT=ifft2(ScaledImgFFT);

54

ImgIFFT ifft2(ScaledImgFFT);ImgIFFT=sqrt(ImgIFFT.*conj(ImgIFFT));ImgOut=ImgIFFT/max(max(ImgIFFT));

MATLABによる画像処理

特徴計測

2値化された各画素はサンプリング情報であり、その画素数を用いて形状を認識したり、位置や距離の計算が行われる。算が行われる。

この計算は”構造要素”と呼ばれる移動要素と、” Minkowski和・差”と呼ばれる演算から成り立つ。

和:集合要素aとbのすべての組み合わせからなる集合差:要素bに対して,(x-b)がAの要素となる集合

この計算をプログラムとして効率よく行うために連接する画素(近傍)を用いる。

形態学的処理(Morphology processing)

55

MATLABによる画像処理

特徴計測形態学処理の例① 膨張(Dilation)ImgBw1=[0 0 0 0 0; 0 0 1 0 0; 0 1 0 1 0; 0 0 1 0 0; 0 0 0 0 0];[xsize,ysize]=size(ImgBw1);%Se=ones(3,3); %8連接MatrixSe=[0 1 0; 1 1 1; 0 1 0]; %4連接MatrixSe=[0 1 0; 1 1 1; 0 1 0]; %4連接MatrixAp=[2,2]; %active pointIout1=zeros(size(ImgBw1));[Sxsize,Sysize]=size(Se);for i=1:xsizefor i=1:xsize

for j=1:ysizeif(ImgBw1(i,j)>0)

for m=1:Sxsizefor n=1:Sysizefor n=1:Sysize

tmp1=i-Ap(1,1)+m;tmp2=j-Ap(1,2)+n;if(Se(m,n)>0 & tmp1>0 & tmp2>0 & tmp1<=xsize & tmp2<=ysize)

Iout1(tmp1 tmp2)=Iout1(tmp1 tmp2)+Se(m n);for i=1:xsize

for j=1:ysizeIout1(tmp1,tmp2)=Iout1(tmp1,tmp2)+Se(m,n);end

endend

end

for j=1:ysizeif(Iout1(i,j)>1)

Iout1(i,j)=1; end

end

56

endend

end

endend

MATLABによる画像処理

特徴計測形態学処理の例② 収縮(Erosion)ImgBw2=Iout1;Iout2=ImgBw2;for i=1:xsize

for j=1:ysizefor j=1:ysizeif(ImgBw2(i,j)>0)

for m=1:Sxsizefor n=1:Sysize

tmp1=i Ap(1 1)+m;tmp1=i-Ap(1,1)+m;tmp2=j-Ap(1,2)+n;if(Se(m,n)~=0 && tmp1>0 && tmp2>0 && tmp1<=xsize && tmp2<=ysize)

if(ImgBw2(tmp1,tmp2)~= 1) Iout2(i j)=0;Iout2(i, j)=0;

endelseif(tmp1>xsize | tmp2>ysize)

Iout2(i,j)=0;endend

endend

endend

57

endend

MATLABによる画像処理

特徴計測形態学処理の例③ ラベリング(Labeling)

2値化で抽出した領域は複数であることが多く そ 中から目的 領域 みを選択する必く,その中から目的の領域のみを選択する必要がある.そこで,各領域に番号を割り振るこれをラベリングと呼ぶ.

動作は,4近傍(または8近傍)の領域を左

鼻の形を分類したいのに…

動作は,4近傍(または8近傍)の領域を左上から右へ、一番右までたどり着いたら1段下の左端からスキャンする。そして、近傍ピクセルをチェックしながら 画素値存在領域クセルをチェックしながら,画素値存在領域に番号を割り振っていく

58

MATLABによる画像処理

特徴計測 ラベリング

clear all;Img=imread(‘z:¥MATLAB¥shapes.bmp');I G d bl (I ( 2))/255 0

ImgLB=ImgBw;ImgLB(1,:)=0; ImgLB(xsize,:)=0; ImgLB(:,1)=0;

( ) %境界除外

<前準備> <ラべリング>

ImgG=double(Img(:,:,2))/255.0;[xsize,ysize]=size(ImgG);avg= mean(mean(ImgG(:,:)));for i=1:xsize

for j 1 si e

ImgLB(:,ysize)=0; %境界除外label=0;for kx=2:xsize-1

for ky=2:ysize-1W (3)for j=1:ysize

if (ImgG(i,j) > avg)ImgBw(i,j)=0;

else ImgBw(i j)=1;

W=zeros(3);W(1:3,1:3)=ImgLB(kx-1:kx+1, ky-1:ky+1); %8連接maxW=max(W(:));if ImgLB(kx,ky)==1 & ImgLB(kx,ky-1)==0 & maxW==1

l b l l b l 1ImgBw(i,j)=1;end

endend

label=label+1;ImgLB(kx,ky)=label;

endif ImgLB(kx,ky)==1 & maxW>=1

I LB(k k ) WImgLB(kx,ky)=maxW;end

endend

59

MATLABによる画像処理

特徴計測 ラベリング

figure(1)<表示>

subplot(1,3,1), imagesc(Img), title('Input')subplot(1,3,2), imagesc(ImgBw), title('Binay')subplot(1,3,3), imagesc(uint8(ImgLB*255/max(max(ImgLB)))), title('Label')colormap('gray');

ラベリング結果を見ると,口の部分のラベリングが完全ではない これは移動領域の面ングが完全ではない.これは移動領域の面積とスキャン方向で2つの物体と認識した結果であり,“ラベルの衝突”が発生している.

これを回避するため,ラベルの再割り振りといった処理が必要となる

60

MATLABによる画像処理

特徴計測 ラベリング%連接しながらラベルが異なる領域を見つける %何もなければ抜ける% 連接しながらラ ルが異なる領域を見つけるloop=1;while loop

flag=0;for kx=2:xsize-1

% 何もなければ抜けるif flag==0

break;end

for kx 2:xsize 1for ky=2:ysize-1

if ImgLB(kx,ky)~=0 & ImgLB(kx+1,ky)~=0& ImgLB(kx,ky)~=ImgLB(kx+1,ky)

old=ImgLB(kx,ky);

% あった場合,同一ラベルにするfor kx=2:xsize-1

for ky=2:ysize-1if ImgLB(kx,ky)==oldg ( , y);

new=ImgLB(kx+1,ky);flag=1;break;

end

g ( , y)ImgLB(kx,ky)=new;

endend

endend

endend

figure(1)subplot(1,3,1), imagesc(Img), title('Input')subplot(1 3 2) imagesc(ImgBw) title('Binay')

<表示>

61

subplot(1,3,2), imagesc(ImgBw), title( Binay )subplot(1,3,3), imagesc(uint8(ImgLB*255/max(max(ImgLB)))), title('Label')colormap('gray');

MATLABによる画像処理

特徴計測 ラベリング

% 自然数順に再ラべリングcurLB=[];

最後に,ラベルを自然数順に並びかえると,後の処理が容易になる

for i=1:length(curLB)for kx=2:xsize-1curLB [];

for kx=2:xsize-1for ky=2:ysize-1

if ImgLB(kx,ky)~=0curLB(ImgLB(kx,ky))=ImgLB(kx,ky);

for kx 2:xsize 1for ky=2:ysize-1

if ImgLB(kx,ky)==curLB(i)ImgLB(kx,ky)=i;

endcu ( g ( , y)) g ( , y);end

endendcount=1;

e dend

endend

;while count

if curLB(count)==0curLB(count)=[];count=count-1;;

endcount=count+1;if count > length(curLB)

break;

62

;end

end

MATLABによる画像処理

特徴計測

また,このラベリング情報を使うと,面積や位置などで必要な領域のみを選択することができる.

%最大面積のみ抽出 <表示>% 最大面積のみ抽出maxArea=0;for k=1:maxLB

if maxArea < sumImg(k)maxArea=sumImg(k);

表示

figure(1)subplot(1,3,1), imagesc(Img), title('Input')subplot(1,3,2), imagesc(ImgBw), title('Binay')subplot(1 3 3) imagesc(uint8(finalImg)) title('MaxArea')maxArea sumImg(k);

maxAreaLB=k;end

endfor i=1:xsize

subplot(1,3,3), imagesc(uint8(finalImg)), title( MaxArea )colormap('gray');

for j=1:ysizepixel=ImgLB(i,j);if pixel~=maxAreaLB;

finalImg(i,j,:)=0;g( ,j, ) ;end

endend

63

MATLABによる画像処理

特徴計測形態学処理の例④ 重心(Center)モーメント情報

座標 ( )∑∑ qp jifji

座標(i,j)における画像f(i,j)の(p+q)次モーメントは

FrN ×=r

F

座標基準

距離

モ メント大きさ

( )∑∑=i j

qppq jifjim ,

( )∑∑ jif0次モーメント(面積)は

r

F

F

座標

Fr ⋅=×= FrNモーメント大きさ ( )∑∑=

i jjifm ,00

( )∑∑ jiif各座標の1次モーメントは

F 座標画素数=面積

重心=モーメント総数

( )∑∑=i j

jiifm ,10

( )∑∑=i j

jijfm ,01

面積

⎟⎠

⎞⎜⎜⎝

⎛= 0110 ,),( mmjiG

よって、重心座標は

64

⎠⎜⎝ 0000 mm

MATLABによる画像処理

特徴計測形態学処理の例④ 重心(Center)maxLB=max(ImgLB(:));sumImg=zeros(1,maxLB); finalImg(:,:,:)=ImgBw*128;

for k=1:maxLB

<表示>

xgra=zeros(1,maxLB);ygra=zeros(1,maxLB);for i=1:xsize

for j=1:ysize

for k=1:maxLBfinalImg(xgra(k)-1:xgra(k)+1, ygra(k)-1:ygra(k)+1, :)=255;

endfigure(1)subplot(1 3 1) imagesc(Img) title('Input')pixel=ImgLB(i,j);

if pixel~=0;xgra(pixel)=xgra(pixel)+i*pixel;ygra(pixel)=ygra(pixel)+j*pixel;

subplot(1,3,1), imagesc(Img), title( Input )subplot(1,3,2), imagesc(ImgBw), title('Binay')subplot(1,3,3), imagesc(uint8(finalImg)), title('Gravity')colormap('gray');

sumImg(pixel)=sumImg(pixel)+pixel;end

endendxgra=round(xgra./sumImg);ygra=round(ygra./sumImg);

65