人脸分割 matlab程序

时间:2023-02-22 08:17:50

人脸脸部的皮肤具有一定的规律(都落在某个YCbCr表示的一个椭圆区域内),符合此规律的辨识为人脸


程序:(自己写, 但结果颜色很奇怪)

function [] = detection()
clear;
close all;
l = imread('2-2.jpg');
figure(1);
imshow(l);
l=double(l);
k=rgb2ycbcr(l);
imshow(k);
f=zeros(267,400);


for i= 1:267
    for j=1:400
%Y=0.257*l(i,j,1)+0.504*l(i,j,2)+0.098*l(i,j,3);
%Cb=0.148*l(i,j,1)-0.291*l(i,j,2)+0.439*l(i,j,3);
%Cr=0.439*l(i,j,1)-0.368*l(i,j,2)-0.071*l(i,j,3);
Y=k(i,j,1);
Cb=k(i,j,2);
Cr=k(i,j,3);
%Wci(Y)
if(Y<125)
Wcb =23+(Y-16)*(46.97-23)/(125-16);
Wcr =20+(Y-16)*(38.76-20)/(125-16); 
aCb =108+(125-Y)*(118-108)/(125-16);%aCi(Y)(Ci(Y)平均数)
aCr =154-(125-Y)*(154-144)/(125-16);
end
if(Y>188)
Wcb =14+(235-Y)*(46.97-14)/(235-188);
Wcr =10+(235-Y)*(38.76-10)/(235-188);
aCb =108+(Y-188)*(118-108)/(235-188);
aCr =154-(Y-188)*(154-132)/(235-188);
end
%Cia(Y)代表Ci'(Y)
if (125<=Y<=88)
    Cba=Cb; 
    Cra=Cr;
end
aCbh=108+(188-188)*(118-108)/(125-16);
aCrh=154-(188-188)*(154-132)/(235-188);
if Y<125 
    Cba=(Cb-aCb)*46.97/Wcb+aCbh;
    Cra=(Cr-aCr)*38.76/Wcr+aCrh;
end
if Y>188
    Cba=(Cb-aCb)*46.97/Wcb+aCbh;
    Cra=(Cr-aCr)*38.76/Wcr+aCrh;
end
%椭圆判断
x = cos(2.53)*(Cba-109.38)+sin(2.53)*(Cra-152.02);
y = -sin(2.53)*(Cba-109.38)+cos(2.53)*(Cra-152.02);
if ((x-1.6)^2/25.39^2+(y-2.41)*(y-2.41)^2/14.03^2<=1)
    f(i,j) = 255; 
else
    f(i,j)=0;
end
    end
end
%figure(2);
%imshow(f);   


运行结果:

原图:人脸分割 matlab程序

结果:人脸分割 matlab程序