简单人脸识别
思路
找到图像中连通域面积最大的那块连通域。
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:10y1=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<=100BW(x1:x2,y1:y2)=0;% 该块变成全黑endimshow(BW);end%列跳跃 就是移到下一块y1=y1+c;y2=y2+c;end%行跳跃 也就是移到下一行x1=x1+r;x2=x2+c;endfigure(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-1p=BB2(1,k)*BB2(1,k+1); %连通域矩形面积%找出最大连通域面积 那块连通域就是我们寻找的人脸了if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8mx=p;j=k;endendsubplot(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--数字图像处理 简单人脸识别》对你有帮助,请点赞、收藏,并留下你的观点哦!