Upload
trinhkhanh
View
263
Download
2
Embed Size (px)
Citation preview
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による画像処理
特徴抽出 周波数フィルタリング(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