?? color_muban.m
字號:
%平均模板代碼 32lie*34hang
I1=imread('I1.bmp')
I2=imread('I2.bmp')
I3=imread('I3.bmp')
I4=imread('I4.bmp')
I5=imread('I5.bmp')
I6=imread('I6.bmp')
I7=imread('I7.bmp')
I8=imread('I8.bmp')
I9=imread('I9.bmp')
I10=imread('I10.bmp')
Igray1=rgb2gray(I1)
Igray2=rgb2gray(I2)
Igray3=rgb2gray(I3)
Igray4=rgb2gray(I4)
Igray5=rgb2gray(I5)
Igray6=rgb2gray(I6)
Igray7=rgb2gray(I7)
Igray8=rgb2gray(I8)
Igray9=rgb2gray(I9)
Igray10=rgb2gray(I10)
Imean12=Igray1/2+Igray2/2
Imean34=Igray3/2+Igray4/2
Imean56=Igray5/2+Igray6/2
Imean78=Igray7/2+Igray8/2
Imean910=Igray9/2+Igray10/2
Imean16=Imean12/3+Imean34/3+Imean56/3
Imean710=Imean78/2+Imean910/2
Imean=Imean16/2+Imean710/2
imshow(Imean)
%標準模板形成
%求模板的均值與方差
uI=mean2(Imean)
DImean=0.0
for i=1:32
for j=1:32
Idouble=double(Imean(i,j))
DImean=DImean+(Idouble-uI)^2
end
end
DIbiao=(DImean/768)^(1/2)
%模板灰度標準化
rateI=80/DIbiao
for i=1:32
for j=1:32
Imean(i,j)=rateI*(Imean(i,j)-uI)+128
end
end
%%待檢測人臉
I=imread('face_detection.jpg')
gray=rgb2gray(I)
gray1=gray
%imshow(gray1)
hsv=rgb2hsv(I)
H=hsv(:,:,1)
Hselect=H<0.08&H>0.02
imshow(Hselect)
bwAreaOpenBW = bwareaopen(Hselect,150);
%imshow(bwAreaOpenBW)
BWfill = imfill(bwAreaOpenBW,'holes')
%imshow(BWfill)
[L,num]= bwlabel(BWfill,8)
%STATS = regionprops(L,'basic')
for i=1:num %%%選擇一個被標記的后選人臉
select_1=L==i
[i,j]=find(select_1==1);
imin=min(i);
imax=max(i);
jmin=min(j);
jmax=max(j);
% h=imax-imin
% w=jmax-jmin
% if h>1.6*w
% h1=round(1.6*w)
bw1=select_1(imin:imax,jmin:jmax); %%%框出
chang_bian=max(imax-imin,jmax-jmin)
duan_bian=min(imax-imin,jmax-jmin)
[Il Ic]=size(gray1)
if jmin+chang_bian>Ic %%%%正方形寬超界..。。一般是寬超界
wide_d=jmin+chang_bian-Ic%%%左移
if jmin-wide_d<1
gray_bw1=gray1(imin:imin+Ic-1,1:Ic)
chang_bian=Ic
else
gray_bw1=gray1(imin:imax,jmin-wide_d:Ic)
end
elseif imin+chang_bian>Il %%%%正方形寬超界..。。一般是寬超界
high_d=imin+chang_bian-Il%%%上移
if imin-high_d<1
gray_bw1=gray1(1:Il,jmin:jmin+Il-1)
chang_bian=Il
else
gray_bw1=gray1(imin-high_d:Il,jmin:jmax)
end
else gray_bw1=gray1(imin:imin+chang_bian,jmin:jmin+chang_bian) %不超界時的情況
% gray_bw1=gray1(imin:imax,jmin:jmax)
end
% i1=round((16-ip)/2);
% j1=round((16-jp)/2);
% p1(i1+1:i1+i,j1+1:j1+j)=Imatch
% p1=-1.*p1+ones(16,16);
% for m=0:15
% p(m*16+1:(m+1)*16,kk+1)=p1(1:16,m+1);
% end
% if (jmax-jmin)/(imax-imin)<1.5 %%%%高寬比小于1.5不處理
% continue
% else
%
% end
%%%% 處理旋轉的問題
%rot_ang 注意角度與弧度的轉變
[i,j]=find(bw1==1);
x=mean2(i)
y=mean2(j)
x_u=i-x
y_u=j-y
a=x_u.'*x_u
b=2*(x_u.'*y_u)
c=y_u.'*y_u
rot_ang=1/2*atan(b/(a-c))
rot=imrotate(bw1,-rot_ang/pi*180)
gray_rot=imrotate(gray_bw1,-rot_ang/pi*180)
figure,imshow(rot)
end
[l,c]=find(rot==1);
imin=min(l);
imax=max(l);
jmin=min(c);
jmax=max(c);
g_k_b=(imax-imin)/(jmax-jmin)
if g_k_b>0.8&g_k_b<2.6
% if g_k_b>1.6
figure,imshow(gray_rot)
rot_ang_abs=abs(rot_ang)%旋轉了多大的角
rot_bian=chang_bian*(sin(rot_ang_abs)+cos(rot_ang_abs))
rot_bian=round(rot_bian)
%rot_bian到nei_bian的距離為d
d=chang_bian*sin(rot_ang_abs)/(1+tan(rot_ang_abs))
d=round(d)
if d==0
d=1 %矩陣從1開始
end
xuanzhedaipipeide=gray_rot(d:rot_bian-d,d:rot_bian-d)
figure,imshow(xuanzhedaipipeide)
else continue
end
end
%end
Imatch=imresize(xuanzhedaipipeide,[32 32])
%rate=32/max(size(bw1));
% Imatch=imresize(bw1,rate); [ip,jp]=size(bw1); if ip>32 ip=32 end
%%求待檢測人臉的均值與方差
% Imatch=bw1
matchgray=rgb2gray(Imatch)
umatch=mean2(matchgray)
DImatch=0.0
for i=1:32
for j=1:32
Imatchdouble=double(matchgray(i,j))
DImatch=DImatch+(Imatchdouble-umatch)^2
end
end
DImatchbiao=(DImatch/768)^(1/2)
%灰度標準化
rateIm=80/DImatchbiao
for i=1:32
for j=1:32
Imean(i,j)=rateIm*(matchgray(i,j)-umatch)+128
end
end
%匹配過程,求標準化后模板的方差
uI=mean2(Imean)
DImean=0.0
for i=1:32
for j=1:32
Idouble=double(Imean(i,j))
DImean=DImean+(Idouble-uI)^2
end
end
DIbiao=(DImean/768)^(1/2)
%求標準化后待檢測人臉的方差
umatch=mean2(matchgray)
DImatch=0.0
for i=1:32
for j=1:32
Imatchdouble=double(matchgray(i,j))
DImatch=DImatch+(Imatchdouble-umatch)^2
end
end
DImatchbiao=(DImatch/768)^(1/2)
%相關系數
covarience=0.0
for i=1:32
for j=1:32
Idouble=double(Imean(i,j))
Imatchdouble=double(matchgray(i,j))
covarience=covarience+(Imatchdouble-umatch)*(Idouble-uI)
end
end
r=covarience/(768*DIbiao*DImatchbiao)
if r>0.6%%%%%%%%%%%%%%%%%%%%匹配成功
%%%%%%%%%%%%plot
[l,c]=size()
for i=1:100
for j=1:64
if BWfill(i,j)==1
x=i+x
y=j+y
n=n+1
end
end
end
xl=x/n
yl=y/n
for i=39:79
for j=10:50
bwfill0(i,j)=0
end
end
for i=10:50
gray1(39,i)=0
end
for i=10:50
gray1(79,i)=0
end
for j=39:79
gray1(j,10)=0
end
for j=39:79
gray1(j,50)=0
end
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -