MATLAB 图像处理 简单人脸检测(详细,你上你也行) 您所在的位置:网站首页 如何辨认脸型图片 MATLAB 图像处理 简单人脸检测(详细,你上你也行)

MATLAB 图像处理 简单人脸检测(详细,你上你也行)

2024-06-08 12:55| 来源: 网络整理| 查看: 265

1.人脸检测原理框图

整体思路是寻找图片中最大的连通域,将其认定为人脸。

第一个环节均值滤波,是为了减弱图像的相关细节部分,以免毛刺影响后期连通域的形成,二值化方便形态学处理,减少运算量。考虑到人脸有黑人和白人黄种人,黑人肤色较深,在二值化之后面部区域不容易形成较大的连通域,如果采取形态学边界提取的办法,就可以避免这个问题,形态学边界提取,只要结构元素够大,也可以形成较大的封闭连通域。

然后就是纵向闭合操作,这一步我选择采用竖向长条状的结构元素进行闭合运算,因为人的脸部和颈部以及头发和衣物等等都是纵向分布的,在进行形态学边界提取的时候,容易将这些靠近的成分割裂开来,这对连通域的判断极为不利,所以用竖向长条状的结构元素在在纵向进行闭合运算,将脸部上下部的区域重新连接起来。

紧接着我又用横向长条状结构元素进行横向腐蚀运算,这是因为,人的头部以下的身体部分存在有大量连通域的时候,容易对最大连通域的判决产生干扰,又因为下半部分,多半呈纵向分布,通过横向腐蚀可以将这些大块的连通域割裂开来,但是要注意的是,割裂程度不应太大,否则会使得上一步闭合操作丧失意义。

接着,由于背景杂物等因素,同样也会产生大量连通域,这会对最后结果的判决产生干扰,因此要予以剔除。

进行了层层筛选之后,在剩下的连通域里面挑一个最大的连通域,并且尺寸形状满足要求的用矩形框框起来作为人脸检测结果。

2 步骤 2.1 均值滤波 h = ones(9)/81; I = uint8(conv2(I,h)); figure,imshow(I),title('线性均值滤波')

采用9x9模板进行线性均值滤波,因为后面调用gpuArray()函数转换对输入数据有要求,所以在进行了二维卷积之后重新将数据格式转换成8位无符号整形数据。

2.2 二值化 BW = imbinarize(I); figure,imshow(BW),title('二值化')

直接调用imbinarize对图像进行二值化

2.3.形态学边界提取 B = ones(21);%结构元素 BW = -imerode(BW,B) + BW; figure,imshow(BW),title('形态学边界提取') BW = bwmorph(BW,'thicken'); figure,imshow(BW),title('加粗边界') BW = not(bwareaopen(not(BW), 300)); figure,imshow(BW),title('把空洞填了')

结构元素采用21x21大小的全1矩阵,先调用imrode()进行腐蚀,再用原图减去腐蚀结果,得到边界。为了让边界更加明显,调用bmworph函数,传入’thicken’参数,意在将边界加粗加厚。最后为了把空洞就是连续的小黑色块填满,调用bwareaopen()函数,该函数是去除面积小于300的白块,为了去除黑块,先调用not(BW)给原来的二值图像取反,去掉取反后面积小于300的白块,再次取反,达到去掉面积小于300的黑块的目的。

2.4 纵向闭合与横向腐蚀 %进行形态学运算 B = strel('line',50,90); BW = imdilate(BW,B); BW = imerode(BW,B); figure,imshow(BW),title('再闭操作之后') B = strel('line',10,0); BW = imerode(BW,B); figure,imshow(BW),title('闭操作之后再腐蚀') BW = gpuArray(BW);

调用strel()函数生成特定的结构元素,第一步调用strel(‘line’,50,90),意思是调用直线型结构元素,长度为50,角度90度,也就是竖直的长条形结构元素。接着利用B调用imdilate和imerode,先进行膨胀再进行腐蚀完成闭操作运算。下一步,继续生成横向长条形结构元素,进行腐蚀操作,注意这里的结构元素不宜面积太大,长度太长,否则会过度影响上一步的结果

最后为了循环过程中提升运算速度,将数据类型更改为gpuArray(),可以在GPU上进行计算,节省时间。

2.5 消除边界多余连通域 %最小化背景 %细分 div = 10; r = floor(n1/div);%分成10块 行 c = floor(n2/div);%分成10块 列 x1 = 1;x2 = r;%对应行初始化 s = r*c;%块面积 %判断人脸是否处于图片四周,如果不是就全部弄黑 %figure for i=1:div y1 = 1;y2 = c;%对应列初始化 for j=1:div loc = find(BW(x1:x2,y1:y2)==0);%统计这一块黑色像素的位置 num = length(loc); rate = num*100/s;%统计黑色像素占比 if (y2=0.8*div*c)||(x1=r*div) if rate


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有