www.gusucode.com > 关于海航matlab和lingo的训练题 > rgb_RGB.m

    %1.色彩空间转换
function [r,g]=rgb_RGB(Ori_Face)
R=Ori_Face(:,:,1);
G=Ori_Face(:,:,2);
B=Ori_Face(:,:,3);
R1=im2double(R);        % 将uint8型转换成double型
G1=im2double(G);
B1=im2double(B);
RGB=R1+G1+B1;
row=size(Ori_Face,1);      % 行像素
column=size(Ori_Face,2);   % 列像素
for i=1:row
for j=1:column
      rr(i,j)=R1(i,j)/RGB(i,j);
      gg(i,j)=G1(i,j)/RGB(i,j);
end
end
rrr=mean(rr);
r=mean(rrr);
ggg=mean(gg);
g=mean(ggg);
%2.均值和协方差
t1=imread('z1.jpg');[r1,g1]=rgb_RGB(t1);
t2=imread('z2.jpg');[r2,g2]=rgb_RGB(t2);
t3=imread('z3.jpg');[r3,g3]=rgb_RGB(t3);
t4=imread('z4.jpg');[r4,g4]=rgb_RGB(t4);
t5=imread('z5');[r5,g5]=rgb_RGB(t5);
t6=imread('z6.jpg');[r6,g6]=rgb_RGB(t6);
t7=imread('z1.jpg');[r7,g7]=rgb_RGB(t7);
t8=imread('z1.jpg');[r8,g8]=rgb_RGB(t8);
t9=imread('z1.jpg');[r9,g9]=rgb_RGB(t9);
t10=imread('z1.jpg');[r10,g10]=rgb_RGB(t10);
t11=imread('z1.jpg');[r11,g11]=rgb_RGB(t11);
t12=imread('z2.jpg');[r12,g12]=rgb_RGB(t12);
t13=imread('z3.jpg');[r13,g13]=rgb_RGB(t13);
t14=imread('z4.jpg');[r14,g14]=rgb_RGB(t14);
t15=imread('z5.jpg');[r15,g15]=rgb_RGB(t15);
t16=imread('z6.jpg');[r16,g16]=rgb_RGB(t16);
t17=imread('z1.jpg');[r17,g17]=rgb_RGB(t17);
t18=imread('z2.jpg');[r18,g18]=rgb_RGB(t18);
t19=imread('z3.jpg');[r19,g19]=rgb_RGB(t19);
t20=imread('z4.jpg');[r20,g20]=rgb_RGB(t20);
t21=imread('z5.jpg');[r21,g21]=rgb_RGB(t21);
t22=imread('z6.jpg');[r22,g22]=rgb_RGB(t22);
t23=imread('z7.jpg');[r23,g23]=rgb_RGB(t23);
t24=imread('z2.jpg');[r24,g24]=rgb_RGB(t24);
t25=imread('z3.jpg');[r25,g25]=rgb_RGB(t25);
t26=imread('z1.jpg');[r26,g26]=rgb_RGB(t26);
t27=imread('z2.jpg');[r27,g27]=rgb_RGB(t27);
r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);
g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);
m=mean([r,g])
n=cov([r,g])
%3.求质心
function [xmean, ymean] = center(bw)
bw=bwfill(bw,'holes');
area = bwarea(bw);


 [m n] =size(bw);
bw=double(bw);
xmean =0; ymean = 0;
for i=1:m,
for j=1:n,
xmean = xmean + j*bw(i,j);
ymean = ymean + i*bw(i,j);
end;
end;
if(area==0)
    xmean=0;
    ymean=0;
else 
    xmean = xmean/area;
    ymean = ymean/area;
    xmean = round(xmean);
  ymean = round(ymean);
    
end
%4. 求偏转角度
function [theta] = orient(bw,xmean,ymean)
[m n] =size(bw);
bw=double(bw);
a = 0; 
b = 0; 
c = 0;
for i=1:m,
for j=1:n,
a = a + (j - xmean)^2 * bw(i,j);
b = b + (j - xmean) * (i - ymean) * bw(i,j);
c = c + (i - ymean)^2 * bw(i,j);
end;
end;
b = 2 * b;
theta = atan(b/(a-c))/2;
theta = theta*(180/pi);   % 从幅度转换到角度
%5. 找区域边界
function [left, right, up, down] = bianjie(A)
[m n] = size(A);
left = -1;
right = -1;
up = -1;
down = -1;
for j=1:n,
   for i=1:m,
     if (A(i,j) ~= 0)
      left = j;
      break;
     end;
   end;
   if (left ~= -1) break; 
   end;
end;
for j=n:-1:1,
for i=1:m,
if (A(i,j) ~= 0)
   right = j;
   break;
end;
end;
if (right ~= -1) break; 
end;
end;
for i=1:m,
for j=1:n,
    if (A(i,j) ~= 0)
    up = i;
    break;
    end;
end;
    if (up ~= -1)
      break;
    end;
end;
for i=m:-1:1,
   for j=1:n,
     if (A(i,j) ~= 0)
      down = i;
      break;
     end;
   end;
    if (down ~= -1) 
     break; 
    end;
end;
%6. 求起始坐标
function newcoord = checklimit(coord,maxval)
newcoord = coord;
if (newcoord<1) 
    newcoord=1; 



end;
if (newcoord>maxval) 
    newcoord=maxval;
end;
%7.模板匹配
function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)
frontalmodel=rgb2gray(frontalmodel); 
model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小
model_rot = imrotate(model_rot,angle,'bilinear');      % 旋转模板
[l,r,u,d] = bianjie(model_rot);                     % 求边界坐标
bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]);      % 选择模板人脸区域
[modx,mody] =center(bwmodel_rot);               % 求质心
[morig, norig] = size(bwmodel_rot);               
% 产生一个覆盖了人脸模板的灰度图像
mfit = zeros(size(mult));
mfitbw = zeros(size(mult));
[limy, limx] = size(mfit);
% 计算原图像中人脸模板的坐标
startx = cx-modx;
starty = cy-mody;
endx = startx + norig-1;
endy = starty + morig-1;
startx = checklimit(startx,limx);
starty = checklimit(starty,limy);
endx = checklimit(endx,limx);
endy = checklimit(endy,limy);
for i=starty:endy,
for j=startx:endx,
mfit(i,j) = model_rot(i-starty+1,j-startx+1);
end;
end;
ccorr = corr2(mfit,mult)        % 计算相关度
[l,r,u,d] = bianjie(bwmodel_rot);
sx = startx+l;
sy = starty+u;
RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标