简单人脸识别

思路
找到图像中连通域面积最大的那块连通域。

i=imread('face.jpg');
I=rgb2gray(i);
BW=im2bw(I); %利用阈值值变换法将灰度图像转换成二进制图像
figure(1);
imshow(BW);


%最小化背景
[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);%找到一块中像素为0的坐标 结果存在矩阵中
[o p]=size(loc);
pr=o*100/s;%黑色像素所占比例

if pr<=100
BW(x1:x2,y1:y2)=0;% 该块变成全黑
end
imshow(BW);
end
%列跳跃 就是移到下一块
y1=y1+c;
y2=y2+c;
end
%行跳跃 也就是移到下一行
x1=x1+r;
x2=x2+c;
end
figure(2)
subplot(1,2,1);
imshow(BW)
title('图像处理');
%人脸识别
L=bwlabel(BW,8);%利用bwlabel()函数得到连通域区间
BB=regionprops(L,'BoundingBox');%得到矩形框 去框住每一个连通域

%对每个矩形框进行记录,记录其左上角点,长,宽 然后转换成矩阵形式
BB1=struct2cell(BB);
BB2=cell2mat(BB1);

[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1
p=BB2(1,k)*BB2(1,k+1); %连通域矩形面积
%找出最大连通域面积 那块连通域就是我们寻找的人脸了
if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
mx=p;
j=k;
end
end
subplot(1,2,2);
title('人脸识别');
imshow(I);
hold on;
%画出人脸区域
rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','r')

结果

MATLAB--数字图像处理  简单人脸识别_数字图像处理