MATLAB图像处理之人脸识别五官定位
目录
最大类间方差法
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找一个阈值为K,将图像的颜色分为1,2…K和K+1…256两部分。
如何确定这个阈值K?算法分类的原理是让背景和目标之间的类间方差最大,因为背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,错分的可能性越小。
OTSU,最大类间方差法 。是一种动态二值化方法。其基本思想是:假设一个阈值,将灰度图像的灰度统图分成两部分(前景部分和背景部分,也成为亮区和暗区),在这两类的类间方差最大的时候,得到的阈值是最优的二值化阈值。
性能:类间方差法对噪音十分敏感,在处理之前应对图片进行去噪处理。
处理步骤:
1.对片进行灰度化处理,并且计算其灰度值统计表N(假设图像大小为P×Q);
2.计算前景像素点数(灰度大于假设阈值T)占整个图像的比例,记做W0
N(i)表示统计图第i列的数值;
计算前景像素点的平均灰度值U0
3.同理求出背景的W1和U1(累加的时候从T加到灰度的最大值)
4.求整个图像的平均灰度值:U=W0×U0 + W1×U1
5.从L个灰度级遍历T,使得T为某个值的时候,前景和背景的方差最大, 则 这个 T 值便是我们要求得的阈值。其中,方差的计算公式如下:
G=W0 × (U0 - U) × (U0 - U) + w1 × (U1 - U) × (U1 - U)
此公式计算量较大,可以采用:
G= W0 × W1 × (U0 - U1) × (Uo - U1)
采用遍历的方法得到使类间方差最大的阈值T,即为所求。
上代码,如下图:
%本程序是利用最大类间方差算法求解自适应阈值,对图像进行分割
%按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找一个阈值为K,将图像的颜色分为1,2.....K和K+1.....256两部分。
clc,clear;close all
warning off;
I=imread('lena.png');
%rgb转灰度
% if ISRGB(I)==1
I_gray=rgb2gray(I);
% else
% I_gray=I;
% end
figure
imshow(I);title('原图')
[m,n,k]=size(I_gray);
figure,subplot(1,2,1)
imshow(I_gray);title('灰度图')
I_double=double(I_gray);%转化为双精度
[wid,len]=size(I_gray);
colorlevel=256; %灰度级
hist=zeros(colorlevel,1);%直方图
%threshold=128; %初始阈值
%算法分类的原理是让背景和目标之间的类间方差最大,因为背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,错分的可能性越小
%计算直方图
for i=1:wid
for j=1:len
m=I_gray(i,j)+1;
hist(m)=hist(m)+1;
end
end
hist=hist/(wid*len);%直方图归一化
miuT=0;
for m=1:colorlevel
miuT=miuT+(m-1)*hist(m);
end
xigmaB2=0;
for mindex=1:colorlevel
threshold=mindex-1;
omega1=0;
omega2=0;
for m=1:threshold-1
omega1=omega1+hist(m);
end
omega2=1-omega1;
miu1=0;
miu2=0;
for m=1:colorlevel
if m<threshold
miu1=miu1+(m-1)*hist(m);
else
miu2=miu2+(m-1)*hist(m);
end
end
miu1=miu1/omega1;
miu2=miu2/omega2;
xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;
xigma(mindex)=xigmaB21;
if xigmaB21>xigmaB2
finalT=threshold;
xigmaB2=xigmaB21;
end
end
fT=finalT/255 %阈值归一化
T=graythresh(I_gray)%matlab函数求阈值
for i=1:wid
for j=1:len
if I_double(i,j)>finalT
bin(i,j)=1;
else
bin(i,j)=0;
end
end
end
subplot(1,2,2),imshow(bin);title('最佳阈值分割')
figure,plot(1:colorlevel,xigma);
title('最大类间方差算法求解自适应阈值')
%%
bw = bin;
figure;
bw=bwmorph(bw,'open',5); % 执行形态学开操作(先腐蚀后膨胀)
subplot(221);
imshow(bw);
title('形态学开操作(先腐蚀后膨胀)');
bw=bwmorph(bw,'hbreak',inf);% 'hbreak'移除连通的像素
subplot(222);
imshow(bw);
title('hbreak移除连通的像素');
bw=bwmorph(bw,'spur',inf);% 移除刺激(孤立)像素。
subplot(223);
imshow(bw);
title('移除刺激(孤立)像素');
bw=bwmorph(bw,'open',5);% 执行形态学开操作(先腐蚀后膨胀)
subplot(224);
imshow(bw);
title('形态学开操作(先腐蚀后膨胀)');
%%
[I2,III]=myCanny(bw,0.15);
figure,imshow(I2);title('canny算子边缘检测')
人脸定位
人脸定位:
基于几何特征的算法,对静态人脸从图像采集、预处理、到特征点定位提取,校验通过,对RGB图像通过形态学图像处理算法选定区域,再进行细化算法,找到其五官坐标并提取出来。
基于特征的方法,基于不变特征的方法主要是通过寻找人脸面部不变的特征来对输入图像进行人脸检测。该类方法认为人脸面部的一些特征(肤色、边缘、纹理等)具有在不同的姿态、视角、表情下都不会发生改变的特性,整体轮廓法。
[I2,III]=myCanny(bw,0.15);
figure,imshow(I2);title('canny算子边缘检测')
%%
img = I;
detector = buildDetector();
[bbox, bbimg ,faces ,bbfaces] = detectFaceParts(detector,img,2); %检测人脸
figure;imshow(bbimg);
for i=1:size(bbfaces,1)
figure;imshow(bbfaces{i}); %定位人脸,并画框
end
最终结果:
程序详情,见我博客主页的演示视频,资源也已上传。