![4988030b79238920d582be40852839f7.png](https://i-blog.csdnimg.cn/blog_migrate/6e1ab04bcefe7b9edbb2d47b18555ef1.jpeg)
简单人脸识别
思路
找到图像中连通域面积最大的那块连通域。
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')
结果
![2d112750744a4c83af63299023225965.png](https://i-blog.csdnimg.cn/blog_migrate/195af9ea57ed008a7ed6719a7a66b8e5.jpeg)
![74d13384dcbf80acd470e95e44eaf869.png](https://i-blog.csdnimg.cn/blog_migrate/efd7a0da8e49cc5b816ad1b0d11a3df3.png)