%肤色建模程序
%200601195 无64 宝雅男
clear all
close all
clc
mulu='wo\';
data=dir(mulu);
num=length(data);
j=1;
for i=1:num
if (~isempty(strfind(data(i).name,'.jpg')))
data1(j)=data(i);
j=j+1;
end
end
num=length(data1);
%画原始图像
figure;
for count=1:num
str=strcat(mulu,data1(count).name);
Input=imread(str);
[Highsize,Widesize,colors]=size(Input);
% subplot(2,3,count)
imshow(Input);
end
Kl=125;
Kh=188;
WCr = 38.76;WLcr = 20;WHcr = 10;
WCb = 46.97;WLcb = 23;WHcb = 14;
cx = 109.38;cy = 152.02;sita= 2.53;ecx = 1.6;ecy = 2.41;a = 25.39;b = 14.03;
%画肤色检测结果
figure;
for count=1:num
str=strcat(mulu,data1(count).name);
Input=imread(str);
[Highsize,Widesize,colors]=size(Input);
select=zeros(Highsize,Widesize);
for j=1:Highsize
for i=1:Widesize
color=Input(j,i,:);
color=double(color);
Y(j,i)=[0.257,0.504,0.098]*[color(1);color(2);color(3)]+16;
Cr(j,i)=[0.439,-0.368,-0.071]*[color(1);color(2);color(3)]+128;
Cb(j,i)=[-0.148,-0.291,0.439]*[color(1);color(2);color(3)]+128;
end
end
Ymin=min(min(Y));
Ymax=max(max(Y));
% Ymin=16;
% Ymax=235;
for j=1:Highsize
for i=1:Widesize
if Y(j,i)<Kl
Cr1(j,i)=154-(Kl-Y(j,i))*(154-144)/(Kl-Ymin);
else if Y(j,i)>Kh
Cr1(j,i)=154+(Y(j,i)-Kh)*(154-132)/(Ymax-Kh);
end
end
if Y(j,i)<Kl
Cb1(j,i)=108-(Kl-Y(j,i))*(118-108)/(Kl-Ymin);
else if Y(j,i)>Kh
Cb1(j,i)=108+(Y(j,i)-Kh)*(118-108)/(Ymax-Kh);
end
end
if Y(j,i)<Kl
Wcr(j,i)=WLcr+(Y(j,i)-Ymin)*(WCr-WLcr)/(Kl-Ymin);
else if Y(j,i)>Kh
Wcr(j,i)=WHcr+(Ymax-Y(j,i))*(WCr-WHcr)/(Ymax-Kh);
end
end
if Y(j,i)<Kl
Wcb(j,i)=WLcb+(Y(j,i)-Ymin)*(WCb-WLcb)/(Kl-Ymin);
else if Y(j,i)>Kh
Wcb(j,i)=WHcb+(Ymax-Y(j,i))*(WCb-WHcb)/(Ymax-Kh);
end
end
if (Y(j,i)<Kl)|(Y(j,i)>Kh)
C1r(j,i)=(Cr(j,i)-Cr1(j,i))*(WCr/Wcr(j,i))+Cr1(j,i);
else if (Y(j,i)>Kl)&(Y(j,i)<Kh)
C1r(j,i)=Cr(j,i);
end
end
if (Y(j,i)<Kl)|(Y(j,i)>Kh)
C1b(j,i)=(Cb(j,i)-Cb1(j,i))*(WCb/Wcb(j,i))+Cb1(j,i);
else if (Y(j,i)>Kl)&(Y(j,i)<Kh)
C1b(j,i)=Cb(j,i);
end
end
x(j,i)=[cos(sita),sin(sita)]*[C1b(j,i)-cx;C1r(j,i)-cy];
y(j,i)=[-sin(sita),cos(sita)]*[C1b(j,i)-cx;C1r(j,i)-cy];
if ((x(j,i)-ecx)^(2)/(a^(2))+(y(j,i)-ecy)^(2)/(b^(2)))<=1
select(j,i)=1;
end
if select(j,i)==1
for k=1:3
output(j,i,k)=(Input(j,i,k));
end
else
for k=1:3
output(j,i,k)=uint8(255);
end
end
end
end
% subplot(2,3,count);
imshow(output);
end
评论0