这一周主要是三个小组的汇报展示,分别是:直方图&haar like feature、PCA&LBP与HOG,在准备汇报的过程中,查阅相关资料,对概念有了比较深的理解,通过听其他组的汇报,也在短时间内了解到了算法的基本思想,受益颇丰。
1. 直方图&haar like feature
a. 直方图
直方图分为灰度直方图与颜色直方图,它是单个像素灰度分布的一阶统计量。纹理是灰度在空间以一定的形式变换产生的图案,直方图是描述图像中像素灰度级分布的工具,可以用直方图或其统计特征作为图像的纹理特征。
有公式:
matlab中可用 imhist()命令提取图像中的灰度直方图信息,colorhist()命令提取图像中的颜色直方图信息,用bar()命令画直方图,结果如下图所示:
b.haar like
haar like特征能更好地描述图片的明暗变化,一般选取具有某种特性的特征模板,在图像子窗口中扩展(平移伸缩)得到的特征称为矩形特征,其值称为特征值。通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。常用的特征模板有:
检测窗口内矩形特征的数量非常多,为了实现快速计算如此多的特征,我们引入积分图这一概念:
积分图:是一个数据结构,可以用于快速计算子区域的像素和。定义为:
表示为在(x,y)位置上,对应的积分图中的像素为其左上角所有像素之和。编程时可以利用递归实现:
,
当求图中矩阵D的像素和时,可由D的四个顶点A、B、C、D点的像素积分进行线性运算得到(由面积的恒等式):
2. PCA&LBP
a. PCA(Principal Component Analysis)主成因分析
是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。PCA是人脸识别的主流方法之一。其核心思想是:重整高维数据,提取其中的重要部分,忽略其中无关紧要的部分。其降维的流程大致如下:图像集合{f(m,n)}中,每张图像可以用堆叠的方式表示成一个维列向量(令H=M*N):
依次将每一个图像列向量构成一个人脸样本矩阵,该样本矩阵即图像集合: 可计算得到训练样本的协方差矩阵为:[Cf]阵为实对称方阵,则其一定存在H个相互正交的属于各个特征值的特征向量,即:
将特征向量按列组成一个矩阵(特征值从大到小排列):
所谓主成分即是具有最大特征值的特征向量,所以我们需要将特征向量按照特征值由大到小排序,然后根据精度要求选择不同数量的特征向量,例如我们选择了前K个特征向量,通常K远小于H。用矩阵E的转置的前K行组成的矩阵构造矩阵P: 矩阵P左乘原始数据矩阵f,就得到了我们需要的降维后的数据矩阵:按照此方法将训练集与测试集均进行降维。P矩阵也就构成PCA人脸识别需要的投影特征空间:
将f向投影空间进行投影计算,得出各个样本在空间Wpca上的投影特征: 将投影后的特征系数存在矩阵g中,g中每一列表示一个人脸样本的特征系数。将训练样本在空间上进行投影,得到投影样本的特征系数,然后将测试样本也在空间上进行投影,得到每个测试杨样本的投影特征系数,此时,只需将测试某个样本的特征系数与训练样本投影特征系数进行欧式距离度量,看要测试的那个样本与训练集中哪个样本的欧式距离最近,就可以将该测试样本归为与之距离最近那个样本的类别。b. LBP (Local Binary Pattern)局部二值模式
是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。LBP特征比较出名的应用是用在人脸识别和目标检测中。 LBP分为原始LBP特征描述,改进版本,常用的有圆形LBP特征描述以及旋转不变LBP特征描述。
原始的LBP算子定义在像素3*3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值:
用公式表示为:
其中, (xc,yc) 是中心像素, 亮度为 Ic, 而 Ip(p=0,1,⋯,P−1) 是相邻像素的亮度. s(⋅) 是一个符号函数。
原始LBP特征使用的是固定邻域内的灰度值,当图像的尺度发生变化时,LBP特征的编码将会发生错误,将不能正确的反映像素点周围的纹理信息,因此研究人员对其进行了改进。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子:
2. HOG(Histogram of Oriented Gradient)
方向梯度直方图(HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在运动目标(特别是行人)的检测中获得了极大的成功。
具体的实现方法是:
首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图中包含的特征组合起来就可以构成特征描述器。
具体实现步骤:
1.对图片做灰度化处理以及伽马矫正
%% 灰度化
img=imread('D:\lena1.jpg');
img=rgb2gray(img);
img=double(img);
figure;
imshow(img,[]);
[m1 ,n1]=size(img);
%改变图像尺寸为step的最近整数倍,要不然后面就会发生错误
img=imresize(img,[floor(m1/step)*step,floor(n1/step)*step],'nearest');
[m,n]=size(img);
%伽马校正
figure;
img=sqrt(img);
imshow(img,[]);
fy=[-1 0 1]; %定义竖直模板
fx=fy'; %定义水平模板
Iy=imfilter(img,fy,'replicate'); %竖直边缘
Ix=imfilter(img,fx,'replicate'); %水平边缘
Ied=sqrt(Ix.^2+Iy.^2); %边缘强度、即梯度的长度
Iphase=Iy./Ix; %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下
figure;
imshow(Ied,[]);
3.取8*8像素为一个cell大小,求一个cell里面的梯度直方图特征(feature)
orient=9;%方向直方图的方向个数
angular=360/orient;
Cell=cell(1,1);
%获取orient个方向的特征向量
step=8; %step*step个像素作为一个cell
ii=1;
jj=1;
for i=1:step:m-step
ii=1;
for j=1:step:n
tmpx=Ix(i:i+step-1,j:j+step-1);
tmped=Ied(i:i+step-1,j:j+step-1);
% 局部边缘强度归一化
tmped=tmped/sum(sum(tmped));
% 边缘斜率局部提取
tmpphase=Iphase(i:i+step-1,j:j+step-1);
Hist=zeros(1,orient);
%统计一个块里面的梯度信息
for p=1:step
for q=1:step
% 判断是不是一个数字True for Not-a-Number.如果不是一个数字,就归零(处理除数为0的情况)
if isnan(tmpphase(p,q))==1
tmpphase(p,q)=0;
end
% 进行象限修正
ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之间
ang=mod(ang*180/pi,360); %全部变正,-90变270
if tmpx(p,q)<0
if ang<90
ang=ang+180;
end
if ang>270
ang=ang-180;
end
end
ang=ang+0.0000001; %防止ang为0
Hist(ceil(ang/angular)) = Hist(ceil(ang/angular))+tmped(p,q); %ceil向上取整,使用边缘强度加权
end
end
%方向直方图归一化
Hist=Hist/sum(Hist);
Cell{ii,jj}=Hist;
ii=ii+1;
end
jj=jj+1;
end
%求feature,2*2个cell合成一个block,没有显式的求block
[m2, n2]=size(Cell);
feature=cell(1,(m2-1)*(n2-1));
for i=1:m2-1
for j=1:n2-1
f=[];
f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
feature{(i-1)*(n2-1)+j}=f;
end
end
l=length(feature);
f=[];
for i=1:l
f=[f;feature{i}(:)'];
end
figure
mesh(f)
图片处理前后的效果如下所示:
对于hog算法的理解:
由于Hog算法提取的是梯度特征,而边缘处梯度较明显,所以能有效显示出图像的轮廓与形状,忽略了轮廓内的细节,所以当物体运动时,也能有效地被检测到。