基于肤色的简易人脸检测(matlab版)
clc; clear all; close all;
% ÔØÈëͼÏñ
Img = imread('D:\renlian\6.jpg');
R=Img(:,:,1);
G=Img(:,:,2);
B=Img(:,:,3);
R1=im2double(R); % ½«uint8ÐÍת»»³ÉdoubleÐÍ´¦Àí
G1=im2double(G);
B1=im2double(B);
RGB=R1+G1+B1;
m=[ 0.4144,0.3174]; % ¾ùÖµ
n=[0.0031,-0.0004;-0.0004,0.0003]; % ·½²î
[x1,y1]=meshgrid(0:0.01:1,0:0.01:1);
a1=sqrt(n(4));a2=sqrt(n(1));r=(-n(2))/(a1*a2);
middle1=1./(2.*pi.*a1.*a2.*sqrt(1-r.^2));
middle2=((-1)./(2.*(1-r.^2))).*(((x1-m(1))).^2./a1.^2-2.*r.*(x1-m(1)).*
(y1-m(2))./(a1.*a2)+(y1-m(2)).^2./a2.^2);
z1=middle1.*exp(middle2);
figure;
subplot(1, 2, 1);mesh(x1,y1,z1);title('ÀíÏëµÄ·ôÉ«·Ö²¼');
row=size(Img,1); % ÐÐÏñËØÊý
column=size(Img,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); % 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(1, 2, 2);mesh(p);title('ʵ¼Ê·ôÉ«·Ö²¼');
if ndims(Img) == 3
I=rgb2gray(Img);
else
I = Img;
end
J=imnoise(I,'salt & pepper',0.01);
I1=filter2(fspecial('average',3),J,'full')/255;
BW = im2bw(I1, graythresh(I1)); % ¶þÖµ»¯
figure;
subplot(2, 4, 1); imshow(Img,[0 1]);title('Ô-ͼÏñ');
subplot(2, 4, 2); imshow(Img,[0 1]);title('Íø¸ñ±ê¼ÇͼÏñ');
hold on;
[xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ...
round(linspace(1, size(I, 2), 10)));
mesh(yt, xt, zeros(size(xt)), 'FaceColor', ...
'None', 'LineWidth', 3, ...
'EdgeColor', 'r');
subplot(2, 4, 3); imshow(p);title('»ùÓÚ·ôÉ«¸ÅÂÊ·Ö²¼µÄ»Ò¶ÈͼÏñ');
subplot(2, 4, 4); imshow(I1);title('ÁÚÓòƽ¾ù·¨Â˲¨ºóͼÏñ');
subplot(2, 4, 5); imshow(BW);title('¶þÖµ»¯ºóͼÏñ');
[n1, n2] = size(BW);
r = floor(n1/10); % ·Ö³É10¿é£¬ÐÐ
c = floor(n2/10); % ·Ö³É10¿é£¬ÁÐ
x1 = 1; x2 = r; % ¶ÔÓ¦Ðгõʼ»¯
s = r*c; % ¿éÃæ»ý
for i = 1:10
y1 = 1; y2 = c; % ¶ÔÓ¦Áгõʼ»¯
for j = 1:10
if (y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
% Èç¹ûÊÇÔÚËÄÖÜÇøÓò
loc = find(BW(x1:x2, y1:y2)==0);
[p, q] = size(loc);
pr = p/s*100; % ºÚÉ«ÏñËØËùÕ¼µÄ±ÈÀýÊý
if pr<= 100
BW(x1:x2, y1:y2) = 0;
r1=x1;r2=x2;s1=y1;s2=y2;
pr1=0;
end
end
y1 = y1+c; % ÁÐÌøÔ¾
y2 = y2+c; % ÁÐÌøÔ¾
end
x1 = x1+r; % ÐÐÌøÔ¾
x2 = x2+r; % ÐÐÌøÔ¾
end
[L, num] = bwlabel(BW, 8); % ÇøÓò±ê¼Ç
stats = regionprops(L, 'BoundingBox'); % µÃµ½°üΧ¾ØÐοò
Bd = cat(1, stats.BoundingBox);
[s1, s2] = size(Bd);
mx = 0;
for k = 1:s1
p = Bd(k, 3)*Bd(k, 4); % ¿í*¸ß
if p>mx && (Bd(k, 3)/Bd(k, 4))<1.8
% Èç¹ûÂú×ãÃæ»ý¿é´ó£¬¶øÇÒ¿í/¸ß<1.8
mx = p;
j = k;
end
end
subplot(2, 4, 6);imshow(I); hold on;
rectangle('Position', Bd(j, :), ...
'EdgeColor', 'r', 'LineWidth', 3);
title('±ê¼ÇͼÏñ');
subplot(2, 4, 7);imshow(Img); hold on;
rectangle('Position', Bd(j, :), ...
'EdgeColor', 'r', 'LineWidth', 3);
title('±ê¼ÇͼÏñ');