【老生谈算法】matlab实现基于肤色和眼睛定位的人脸检测算法源码——人脸检测算法

基于肤色和眼睛定位的人脸检测算法——MATLAB实现

本文提出了一种基于肤色信息和眼睛粗略定位的人脸检测算法。

1、算法介绍:

该算法先对 Anil K.Jain 的 Cb 、 Cr 椭圆聚类方法进行了改进,用改进的算法进行肤色提取,经过肤色区域的分析,对人脸区域进行预检测,确定人脸可能区域,然后再根据眼睛的粗略定位进一步确定人脸区域。

一、肤色分析(skin.m)
Anil K.Jain提出的基于YCbCr颜色空间的肤色模型,根据当前点的Cb Cr值判断是否为肤色。

1	% Anil K.Jain提出的基于YCbCr颜色空间的肤色模型  
2	% 根据当前点的Cb Cr值判断是否为肤色  
3	function result = skin(Y,Cb,Cr)  
4	% 参数  
5	a = 25.39;  
6	b = 14.03;  
7	ecx = 1.60;  
8	ecy = 2.41;  
9	sita = 2.53;  
10	cx = 109.38;  
11	cy = 152.02;  
12	xishu = [cos(sita) sin(sita);-sin(sita) cos(sita)];  
13	% 如果亮度大于230,则将长短轴同时扩大为原来的1.114	if(Y > 230)  
15	    a = 1.1*a;  
16	    b = 1.1*b;  
17	end  
18	% 根据公式进行计算  
19	Cb = double(Cb);  
20	Cr = double(Cr);  
21	t = [(Cb-cx);(Cr-cy)];  
22	temp = xishu*t;  
23	value = (temp(1) - ecx)^2/a^2 + (temp(2) - ecy)^2/b^2;  
24	% 大于1则不是肤色,返回0;否则为肤色,返回1  
25	if value > 1  
26	    result = 0;  
27	else  
28	    result = 1;  
29	end   
二、眼睛粗略定位(findeye.m)
30	% 判断二值图像中是否含有可能是眼睛的块  
31	%   bImage----二值图像  
32	%   x---------矩形左上角顶点X坐标  
33	%   y---------矩形左上角顶点Y坐标  
34	%   w---------矩形宽度  
35	%   h---------矩形长度  
36	% 如果有则返回值eye等于1,否则为0  
37	function eye = findeye(bImage,x,y,w,h)  
38	% 根据矩形相关属性得到二值图像中矩形区域中的数据  
39	% 存放矩形区域二值图像信息  
40	part = zeros(h,w);  
41	% 二值化  
42	for i = y:(y+h)  
43	    for j = x:(x+w)  
44	        if bImage(i,j) == 0  
45	            part(i-y+1,j-x+1) = 255;  
46	        else  
47	            part(i-y+1,j-x+1) = 0;  
48	        end  
49	    end  
50	end  
51	[L,num] = bwlabel(part,8);  
52	% 如果区域中有两个以上的矩形则认为有眼睛  
53	if num < 2  
54	    eye = 0;  
55	else  
56	    eye = 1;  
57	end   

三、人脸检测(facedetection.m)

58	function facedetection(img_name)  
59	% 读取RGB图像  
60	I = imread(img_name);  
61	% 转换为灰度图像  
62	gray = rgb2gray(I);  
63	% 将图像转化为YCbCr颜色空间  
64	YCbCr = rgb2ycbcr(I);  
65	% 获得图像宽度和高度  
66	heigth = size(gray,1);  
67	width = size(gray,2);  
68	% 根据肤色模型将图像二值化  
69	for i = 1:heigth  
70	    for j = 1:width  
71	        Y = YCbCr(i,j,1);  
72	        Cb = YCbCr(i,j,2);  
73	        Cr = YCbCr(i,j,3);  
74	        if(Y < 80)  
75	            gray(i,j) = 0;  
76	        else  
77	            if(skin(Y,Cb,Cr) == 1)  
78	                gray(i,j) = 255;  
79	            else  
80	                gray(i,j) = 0;  
81	            end  
82	        end  
83	    end  
84	end  
85	% 二值图像形态学处理  
86	SE=strel('arbitrary',eye(5));    
87	%gray = bwmorph(gray,'erode');  
88	% imopen先腐蚀再膨胀  
89	gray = imopen(gray,SE);  
90	% imclose先膨胀再腐蚀  
91	%gray = imclose(gray,SE);  
92	imshow(gray);  
93	% 取出图片中所有包含白色区域的最小矩形  
94	[L,num] = bwlabel(gray,8);  
95	STATS = regionprops(L,'BoundingBox');  
96	% 存放经过筛选以后得到的所有矩形块  
97	n = 1;  
98	result = zeros(n,4);  
99	figure,imshow(I);  
100	hold on;  
101	for i = 1:num  
102	    box = STATS(i).BoundingBox;  
103	    x = box(1);    %矩形坐标x  
104	    y = box(2);    %矩形坐标y  
105	    w = box(3);    %矩形宽度w  
106	    h = box(4);    %矩形高度h  
107	    % 宽度和高度的比例  
108	    ratio = h/w;  
109	    ux = uint8(x);  
110	    uy = uint8(y);  
111	    if ux > 1  
112	        ux = ux - 1;  
113	    end  
114	    if uy > 1  
115	        uy = uy - 1;  
116	    end  
117	    % 可能是人脸区域的矩形应满足以下条件:  
118	    %   1、高度和宽度必须都大于20,且矩形面积大于400  
119	    %   2、高度和宽度比率应该在范围(0.6,2)内  
120	    %   3、函数findeye返回值为1  
121	    if w < 20 || h < 20 || w*h < 400  
122	        continue  
123	    elseif ratio < 2 && ratio > 0.6 && findeye(gray,ux,uy,w,h) == 1  
124	        % 记录可能为人脸的矩形区域  
125	        result(n,:) = [ux uy w h];  
126	        n = n+1;  
127	    end  
128	end  
129	% 对可能是人脸的区域进行标记  
130	if  size(result,1) == 1 && result(1,1) > 0  
131	    rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');  
132	else  
133	    % 如果满足条件的矩形区域大于1则再根据其他信息进行筛选  
134	    for m = 1:size(result,1)  
135	        m1 = result(m,1);  
136	        m2 = result(m,2);  
137	        m3 = result(m,3);  
138	        m4 = result(m,4);  
139	        % 标记最终的人脸区域  
140	        if m1 + m3 < width && m2 + m4 < heigth  
141	            rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');  
142	        end  
143	    end  
144	end   

四、主函数(main.m)

145	%清理窗口  
146	close all  
147	clear all  
148	clc  
149	% 输入图像名字  
150	img_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');  
151	% 当输入0时结束  
152	while ~strcmp(img_name,'0')  
153	    % 进行人脸识别  
154	    facedetection(img_name);  
155	    img_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');  
156	end  

2、源码下载:

人脸检测算法matlab源码如下,有需要的朋友可以点击进行下载

序号 matlab人脸检测算法源码(点击下载)
1 matlab基于PCA+SVM的人脸识别系统_PCA_SVM_人脸识别_matlab
1 基于ICA独立成分分析的matlab人脸识别程序源码_包含测试图片集_ICA_独立成分分析_人脸识别_matlab
1 基于Matlab主成分分析(PCA)算法的人脸识别系统源码+项目设计文档_人脸识别_主成分分析_PCA_matlab
1 Matlab主成份分析(PCA)人脸识别源代码_PCA_人脸识别_matlab
1 LDA线性辨别分析的人脸识别算法_采用KNN分类_LDA_matlab
1 LBP特征提取用于人脸识别_含训练样本和测试样本_LBP_人脸识别_matlab
1 BP神经网络人脸识别_带论文_人脸识别_matlab

猜你喜欢

转载自blog.csdn.net/m0_53407570/article/details/125398082