基本思想是首先对人脸照片进行变换提取特征,最后在利用某种分类器对特征分类,用以决定属于哪一个人,最后再进行识别,计算准确度,这个项目主要是为了训练我们对于DSP的熟练情况和使用情况,同时了解一些小波变换和分类方法,仅用来学习,对于正确率没有要求,所以最后做好后准确率大概70%左右,也不算高。
首先我们小组利用的是harr小波变换进行特征提取
先简单说一下harr小波变换的原理:
小波变换(wavelettransform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了Fourier变换的困难问题
哈尔函数是由Haar提出的一种正交完备函数系;是一种既反映整体又反映局部的函数;它是小波变换中的典型小波,;
哈尔变换和小波变换适用非平稳信号的分析与处理。
哈尔变换的特点:
(1) 具有尺度和位移两个特性;
(2) 变换范围窄;
(3) 其变换特性与图像中的边界或线条的特性十分接近,因此图像中的边缘和线条经哈尔变换后,会产生较大的变换系数,而其它区划的变换系数小。
因为DSP上直接进行小波变换的源码比较少,因此我们先从matlab入手,找到了部分matlab的harr变换源码
先了解harr变换的一维代码:
function out=selfdwt(in,J)
% 完成J尺度Haar小波变换
% in 是输入信号
% out 是输出的小波系数
%h0,h1是相应的小波和尺度向量
h0=[1/sqrt(2),1/sqrt(2)];
h1=[-1/sqrt(2),1/sqrt(2)];
out=zeros(size(in));
m=size(in);%此处的m为一向量
x=length(in);
k=0;
l=0;
Wl=in;
for i=1:J
%=================此处对应于高频部分,结果中抽取偶数的点=====================
Wh=conv(h1,Wl);%卷积函数
for j=1:(length(h1)+length(Wl)-1)
if mod(j,2)==0%mod函数求j/2的模,相当于求余数,且余数一定是整数
k=k+1;
out(round(x/2)+k)=Wh(j);%round是四舍五入函数,因为这里x一定是整数,所以roundx/2相当于如果x为偶数则为x/2,奇数则为x/2+1
end
end
%============================================================================
%===============下面对应于低频部分,结果中抽取偶数点=========================
Wl1=conv(h0,Wl);
for j=1:(length(h0)+length(Wl)-1)
if mod(j,2)==0
l=l+1;
out(l)=Wl1(j);
end
end
%===========================================================================
x=round(x/2);
m=round(m/2);
Wl=zeros(m);
for j=1:x
Wl(j)=out(j);
end
k=0;
l=0;
end
%对一幅图像I进行M尺度的小波变换
I=imread('s1.bmp');
M=1;% M----小波变换的尺度
I1=double(I);%强制转换类型为double型,I为512*512*3的像素数组
[m,n]=size(I);%m=128,n=128
Iout=zeros(size(I));%生成512*512*3的全零矩阵
W1=zeros(size(I));%生成512*512*3的全零矩阵
%=============Haar wavelete transform==================
W1=I1;%W1=像素数组
for k=1:M%进行两次迭代
for i=1:n%对所有列进行变换
W1(:,i)=selfdwt(W1(:,i),1);%对列进行变换
end
for i=1:m%对所有行进行变换
W1(i,:)=selfdwt(W1(i,:),1);%对行进行变换
end
for i=1:m%输出值
for j=1:n
Iout(i,j)=W1(i,j);
end
end
m=m/2;%m=256
n=n/2;%m=256*3
W1=zeros(m,n);%生成第一次得出的结果
for i=1:m
for j=1:m
W1(i,j)=Iout(i,j);
end
end
end
%=====================&