一、简介
基于matlab图像处理的人脸定位系统,人脸定位是计算机视觉领域的一个重要研究方向,其主要目的是从图像或视频中准确地检测出人脸的位置,并定位面部的关键特征点。MATLAB作为一款强大的数值计算与数据分析软件,为人脸定位提供了丰富的算法工具和实现平台。本文将介绍MATLAB在人脸定位中的应用,包括基本原理、常用算法及实现方法。
二、部分源码
clc;
clear all;
close all;
tic
x=imread('3.jpg');
y=rgb2ycbcr(x); %将彩色图片从RGB空间转换到YCbCr色彩空间
[a b c]=size(y); %获取图像的行数、列数、页数;注意新空间里图像是三维数组
cb=double(y(:,:,2)); %得到图像的Cb分量
cr=double(y(:,:,3)); %得到图像的Cr分量
%下面开始计算每个像素点的肤色概率
for i=1:a;
for j=1:b
w=[cb(i,j) cr(i,j)]; %色度矩阵
n=[97.0916 23.3700;23.3700 137.9966]; %协方差矩阵,对应此处离散高斯分布
p(i,j)=exp((-0.5)*(w-m)*inv(n)*(w-m)'); %计算肤色概率,即相似度
end
end
z=p./max(max(p));%归一化结果
%下面开始阈值化
%figure
th=0.5;
for i=1:a
for j=1:b
if(z(i,j)>th)
z(i,j)=1;
else
z(i,j)=0;
end
end
end
figure;%%开始一边处理一边出图了!
subplot(2,2,1);
imshow(z);
title('阈值化图像') %阈值化结果
%下面做数学形态学处理,先后进行了开运算、闭运算、填洞、腐蚀及膨胀操作
se=strel('square',3);
f=imopen(z,se); %开运算
f=imclose(f,se); %闭运算
f=imfill(f,'holes');%填洞
se1=strel('square',8);
%构造结构元素(strel是Structuring element的简写)
f=imerode(f,se1); %腐蚀
f=imdilate(f,se1); %膨胀
%至此得到了一个较纯净的肤色区域
%下面试图将人脸区域与其它肤色区域分割开
[L,num]=bwlabel(f,4); num(连通区域的个数)
for i=1:num;
[r,c]=find(L==i);%第i个连通区域
len=max(r)-min(r)+1;%区域长度
wid=max(c)-min(c)+1;%区域宽度
area_sq=len*wid;%区域面积
area=size(r,1);%区域大小,即像素点的个数
%开始判定第i个连通区域是不是人脸区域
for j=1:size(r,1)
if(len/wid<.8)|(len/wid>2.4)|size(r,1)<200|area/area_sq<0.55
L(r(j),c(j))=0;%如果不是人脸区域,则通过赋值将其融入背景色
else
continue;
end
end
end
subplot(2,2,2);
imshow(L);
title('人脸区域')%人脸区域显示
w=L&z;
subplot(2,2,3);
imshow(w);
title('人脸特征图像')%人脸特征点显示
%开始标记人脸区域,这里用矩形标记,读者也可以尝试用
[r c]=find(L~=0);
r_min=min(r);
r_max=max(r);
subplot(2,2,4);
imshow(x);
title('人脸定位图像')
rectangle('Position',[c_min r_min c_max-c_min r_max-r_min],'EdgeColor','r');
%以矩形区域为人脸检测的结果
toc
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信