- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)]; % 产生矩形坐标
% 图片格式代表值
case 0
errordlg('You Should Load Image File First...','Warning...');
case{'g';'G';'p';'P';'f';'F'}; 或者 GIF/gif ,才打开
% 图片格式若是 JPG/jpg、 BMP/bmp、 TIF/tif
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);
image_low=filter2(low_pass, p);
% 低通滤波去噪声
subplot(2,3,3);imshow(image_low);
% 自适应阀值程序
previousSkin2 = zeros(i,j);
changelist = [];
for threshold = 0.55:-0.1:0.05
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)
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;
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);
% 均值 % 方差
row=size(Ori_Face,1);
% 行像素数
column=size(Ori_Face,2);
% 列像素数
for i=1:row
for j=1:column
if RGB(i,j)==0
rr(i,j)=0;gg(i,j)=0;
else
rr(i,j)=R1(i,j)/RGB(i,j);
end;
if (newcoord>maxval) newcoord=maxval;
end;
7.模板匹配
function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy,
angle)
frontalmodel=rgb2gray(frontalmodel);
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
I=cat(2,pname,fname);
Ori_Face=imread(I);
subplot(2,3,1),imshow(Ori_Face);
otherwise errordlg('You Should Load Image File First...','Warning...');
end
R=Ori_Face(:,:,1);
G=Ori_Face(:,:,2);
B=Ori_Face(:,:,3);
R1=im2double(R); G1=im2double(G);
% 将 uint8 型转换成 double 型处理
B1=im2double(B);
RGB=R1+G1+B1;
m=[ 0.4144,0.3174]; n=[0.0031,-0.0004;-0.0004,0.0003];
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;
% rgb 归一化
gg(i,j)=G1(i,j)/RGB(i,j);
x=[rr(i,j),gg(i,j)];
p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)');
% 皮肤概率服从高斯分布
end
end
end
subplot(2,3,2);imshow(p);
% 显示皮肤灰度图像
low_pass=1/9*ones(3);
皮肤库 \9.jpg');[r9,g9]=rgb_RGB(t9); 皮肤库 \10.jpg');[r10,g10]=rgb_RGB(t10); 皮肤库 \11.jpg');[r11,g11]=rgb_RGB(t11); 皮肤库 \12.jpg');[r12,g12]=rgb_RGB(t12); 皮肤库 \13.jpg');[r13,g13]=rgb_RGB(t13); 皮肤库 \14.jpg');[r14,g14]=rgb_RGB(t14); 皮肤库 \15.jpg');[r15,g15]=rgb_RGB(t15); 皮肤库 \16.jpg');[r16,g16]=rgb_RGB(t16); 皮肤库 \17.jpg');[r17,g17]=rgb_RGB(t17); 皮肤库 \18.jpg');[r18,g18]=rgb_RGB(t18); 皮肤库 \19.jpg');[r19,g19]=rgb_RGB(t19); 皮肤库 \20.jpg');[r20,g20]=rgb_RGB(t20); 皮肤库 \21.jpg');[r21,g21]=rgb_RGB(t21); 皮肤库 \22.jpg');[r22,g22]=rgb_RGB(t22); 皮肤库 \23.jpg');[r23,g23]=rgb_RGB(t23); 皮肤库 \24.jpg');[r24,g24]=rgb_RGB(t24); 皮肤库 \25.jpg');[r25,g25]=rgb_RGB(t25); 皮肤库 \26.jpg');[r26,g26]=rgb_RGB(t26); 皮肤库 \27.jpg');[r27,g27]=rgb_RGB(t27);
model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小
model_rot = imrotate(model_rot,angle,'bilinear');
% 旋转模板
[l,r,u,d] = bianjie(model_rot);
% 求边界坐标
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,
rrr=mean(rr);
r=meቤተ መጻሕፍቲ ባይዱn(rrr);
ggg=mean(gg);
g=mean(ggg);
2.均值和协方差
皮肤库 \1.jpg');[r1,g1]=rgb_RGB(t1); 皮肤库 \2.jpg');[r2,g2]=rgb_RGB(t2); 皮肤库 \3.jpg');[r3,g3]=rgb_RGB(t3); 皮肤库 \4.jpg');[r4,g4]=rgb_RGB(t4); 皮肤库 \5.jpg');[r5,g5]=rgb_RGB(t5); 皮肤库 \6.jpg');[r6,g6]=rgb_RGB(t6); 皮肤库 \7.jpg');[r7,g7]=rgb_RGB(t7); 皮肤库 \8.jpg');[r8,g8]=rgb_RGB(t8);
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));
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);
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,
8.主程序
clear;
[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color
picture...');
% 返回打开的图片名与图片路径名
[u,v]=size(fname);
y=fname(v); switch y