本算法原文如下,有需要的朋友可以点击进行下载
序号 | 原文(点击下载) |
---|---|
本项目原文 | 【老生谈算法】基于肤色和眼睛定位的人脸检测算法——MATLAB实现.doc |
本文提出了一种基于肤色信息和眼睛粗略定位的人脸检测算法。
该算法先对 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.1倍
14 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
人脸检测算法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 |