人脸识别算法在人脸识别和匹配领域中一个非常重要的技术。为了获得一个较好的识别效果,人脸特征的提取十分关键。 但是大多数算法在实际工作中无法获得较好的识别效果。为了解决这个问题,基于NSCT变换提取人脸的特征数据。
NSCT变换是在Contourlet变换的基础上提出的,不仅具有多分辨率、局部化和多方向等特点,还具有平移不变性,从而克服了Contourlet变换存在的缺陷。NSCT变换在结构上可以分为非下采样金字塔滤波器组(NSPFB)和非下采样方向滤波器组(NSDFB)两部分。其中NSPFB采用àtrous算法设计,能实现完全重构的双通道滤波器。其结构如下图:
而NSDFB在结构上为一个双通道扇形滤波器。为了获得更高精确的分解,采用方向滤波器组,对下一级滤波器采用基于梅花矩阵的上采样。其结构如下图所示:
其插值扇形滤波器有棋盘状的频域支撑,和前一级的滤波器结合在一起实现四个方向的频域分解。通过该滤波器组,可以将频域分解为多个楔形频率区域。
关于NSCT工具箱的调用程序和完美注释:
function [Insp,Insct]= myNSCTd(I,levels,pfiltername,dfiltername,type)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%函数功能:完成图像的level级NSCT分解%%函数输入:I ——输入源图像% levels ——分解级别的数组,例如[1,2,3],分解的方向数分别为[2,4,8].% pfiltername ——塔式分解滤波器名称% dfiltername ——方向分解滤波器名称%%函数输出:Insct ——输出为cell类型,包括低通以及各级别各方向的分量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%生成非下采样金字塔滤波器组%%%%%%%%%%%%%%该函数为copy的,可选参数如下:%'9-7'、'maxflat'、'pyr'、'pyrexc'%输出的h0,h1是金字塔分解滤波器%输出的g0,g1是金字塔重构滤波器[ph0, ph1, pg0, pg1] = atrousfilters(pfiltername);%无法改进%%%%%%%%%生成非下采样方向滤波器组%%%%%%%%%%%%%%建立一个4*4的空矩阵,存放滤波器组filtersd = cell(4) ;%function [h0, h1] = dfilters(fname, type)%copy的函数,作用是根据名字生成方向滤波器%fname的可选参数有:'haar'、'vk'、'ko'、'kos'、%'lax'、'sk'、'cd'、'pkva'、'oqf_362'、'sinc'%其中测验结果看的比较舒服的有'lax'、'sk'、'cd'%最理想的是'pkva',copy函数中的ldfilter.m、%ld2quin.m和qupz.m都是用语生成该滤波器%type的可选参数有:'d'、'r',分别表示生成分解%滤波器和重构滤波器。%输出的h0为小波函数(高频),h1为尺度函数(低频)[dh1, dh2] = dfilters(dfiltername, 'd'); %无法改进dh1 = dh1./sqrt(2) ;dh2 = dh2./sqrt(2) ;%function y = modulate2(f, type, center)%copy的函数,作用是将输入的方向滤波器f依据type类型增加方向性%type可选参数有:'r'生成横向梳状滤波器、'c'生成纵向梳状滤%波器、%'d'生成网格型滤波器(综合横纵梳状滤波器的特点)%center参数,对输入滤波器的初始中心作确定,通常默认为[0 0]。filtersd{1} = modulate2(dh1, 'c');%无法改进filtersd{2} = modulate2(dh2, 'c');%无法改进%function [y1, y2] = parafilters( f1, f2 )%copy的函数,输入是两个滤波器,输出是两个滤波器组%作用是将输入的两个滤波器分别增加行列方向性之后%再分别转置,生成四个不同的滤波器%随后循环调用function y = resampz(x, type, shift)%copy的函数,输入是单个滤波器x,type是上面生成的四个滤波器%中的第几个,shift通常不输入,为默认值1.%对每个滤波器作旋转,即生成四个旋转后的方向滤波器。%综合结果:%对输入的两个滤波器,输出两组旋转后的滤波器,每组四个[filtersd{3}, filtersd{4}] = parafilters( dh1, dh2 ) ;%无法改进%判断分解层数clevels = length( levels );%初始化输出缓存nIndex = clevels + 1 ;y = cell(1, nIndex) ;Insp=cell(1,clevels);%NSCT分解for i= 1 : clevels %对图像进行金字塔分解,xlo为低通输出,xhi为高通输出 switch type case 'NSCT' [Ilow, Ihigh] = NSPd(I, ph0, ph1, i-1) ;%无法改进 %NSPlow{i}=Ihigh; case 'NewPM' [Ilow,Ihigh]=Newmcd(I); end %如果方向分解级别不为0,进行方向分解,并将结果存入y的对应部分 if levels(nIndex-1) > 0 % function nsdfbdec中,在level高于3的时候,采样矩阵M的设定不懂, % 所以只能copy过来。 Ihigh_dir = nsdfbdec(Ihigh, filtersd, levels(nIndex-1)); y{nIndex}=Ihigh_dir ; %若方向分解级别为0,直接复制 else y{nIndex}=xhigh ; end %更新输出缓存指针 nIndex = nIndex - 1 ; %更新图像为分解的低通部分,进行下一次迭代 I = Ilow ; Insp{i}=I;end% 输出的第一副图为最后的低通结果。y{1}=I;Insct=y;end1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.
clc;clear;close all;warning off;addpath 'func\'%%%%重构时间比较(差异度测试)I = imread('1.bmp');I = im2double(I);levels = [1 2 3];pname ='pyr';dname ='pkva';type ='NSCT';[Insp,Insct]= myNSCTd(I,levels,pname,dname,type);% IMf = myNSCTr(Insct,levels,pname,dname,type);figure;imshow(I,[]);figure;imshow(abs(Insp{1,1}),[]);figure;imshow(abs(Insp{1,2}),[]);figure;imshow(abs(Insp{1,3}),[]);1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删