m基于小波神经网络和HOG特征提取的手写汉字识别算法matlab仿真

发布时间 2023-03-22 21:12:54作者: 我爱C编程

1.算法描述

1.读入多张图像,对图像进行去噪、二值话、裁剪、细化等预处理

 

2.特征提取:首先将汉字分为横竖撇捺4个分量,然后对每个分量图像进行4×4弹性网格的划分,(也可以用其他更好的特征提取的方法,但一定要注释清楚),这样每一个字都有4×4×4=64维数据作为小波神经网络的输入数据。

 

3.小波神经网络训练:对每一个汉字用100个不同人的字体进行训练(最好根据小波神经网络的算法步骤来,参考以下程序)

 

4.训练完成之后,每一个汉字用20个字测试

 

5.统计识别率,对训练次数、隐含层个数、训练字的个数的不同看看识别率的情况。

 

HOT特征提取过程如下所示:

 

1HOG特征:

 

       方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。

 

1)主要思想:

 

       在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

 

2)具体的实现方法是:

 

       首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

 

3)提高性能:

 

       把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

 

4)优点:

 

       与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

 

2HOG特征提取算法的实现过程:

 

大概过程:

 

HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):

 

1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

 

2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

 

3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

 

4)将图像划分成小cells(例如6*6像素/cell);

 

5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个celldescriptor

 

6)将每几个cell组成一个block(例如3*3cell/block),一个block内所有cell的特征descriptor串联起来便得到该blockHOG特征descriptor

 

7)将图像image内的所有blockHOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

 

       小波变换是近十几年信信号处理领域研究的一个热点,许多学者将小波在理论上的研究成果应用到诸如图像压缩、特征提取、信号滤波和数据融合等方面,而且小波变换的领域还在不断地发展当中。小波之所以在信号处理领域具有很大的优势,在于小波变换可以获得信号的多分辨率描述,这种描述符合人类观察世界的一般规律,同时,小波变换具有丰富的小波基以适应具有不同特性的信号。小波神经网络的基本结构如下所示:

 

 

 

 

         基于小波的人工神经网络,即小波神经网络(WNN)是对生物神经进行仿真研究的结果,是基于生物学中的神经网络的基本原理,按照控制工程的思路和数学描述的方法建立起来的数学模型。WNN能够模拟人脑的结构与功能机制,实现某方面的功能,能自我感知,自主适应,有很强的学习和逼近功能;能比较准确地揭示非线性复杂动力系统的内在关系和演化机理。所以WNN可以用来分析和预测网络流量行为和演化趋势。

 

       在实际应用中,选择小波主要从小波的对称性、正则性、支撑长度、消失矩等性质方面考虑。对称性主要用于图像处理中,对称性好的小波在进行二维图像处理中可以避免相移,简化计算;消失矩阶数大的小波变换能量更集中,在压缩中用处很大;正则性则主要用来刻画函数的光滑程度,一般正则性好的小波函数光滑性也越好,能够获得更好的重构信号;支撑长度一般与消失矩和正则性相关,支撑长度越长,消失矩和正则性也越高,但支集太长会发生边界问题,支集太短则不利于信号能量的集中。

 

      小波函数具有不同的族系,常见的有:haar小波、Meyer小波、dbN系列小波、symN系列小波、coifN系列小波。不同的小波函数具有不同的特性,对同一信号的处理效果也不同。Haar小波是小波分析发展过程中用的最早的小波,也是最简单的小波,一般只用来理解小波分析的原理,不用于分析实际问题;Meyer小波不具有紧支性,所以在进行离散小波变换时不存在快速算法,但由Meyer小波构造的滤波器具有很高的消失矩;dbN系列小波、symN系列小波、coifN系列小波都是由DaubechieS提出来的具有紧支性的正交小波系,三种小波系相比,SymN小波类似于dbN小波,但它具有更好的对称性,而coifN小波具有更长的支撑长度和更大的消失矩,对称性也比较好。

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

3.MATLAB核心程序

 

%train
for i = 1:100
    P_train(i,:) = [Fd{i}];
end
for i = 1:100
    P_train(100+i,:) = [Fx{i}];
end
for i = 1:100
    P_train(200+i,:) = [Fz{i}];
end
T_train = [1*ones(100,1);2*ones(100,1);3*ones(100,1);];
 
 
%test
for i = 1:20
    P_test(i,:) = [Fd{100+i}];
end
for i = 1:20
    P_test(20+i,:) = [Fx{100+i}];
end
for i = 1:20
    P_test(40+i,:) = [Fz{100+i}];
end
T_test = [1*ones(20,1);2*ones(20,1);3*ones(20,1);];
net1   = newgrnn(P_train',T_train',0.1);
yout   = round(net1(P_test'));
disp('正确率:'); 
100*length(find(yout==T_test'))/length(T_test')
load feature.mat
%train
for i = 1:100
    P_train(i,:) = [Fd{i}];
end
for i = 1:100
    P_train(100+i,:) = [Fx{i}];
end
for i = 1:100
    P_train(200+i,:) = [Fz{i}];
end
T_train = [1*ones(100,1);2*ones(100,1);3*ones(100,1);];
%test
for i = 1:20
    P_test(i,:) = [Fd{100+i}];
end
for i = 1:20
    P_test(20+i,:) = [Fx{100+i}];
end
for i = 1:20
    P_test(40+i,:) = [Fz{100+i}];
end
T_test = [1*ones(20,1);2*ones(20,1);3*ones(20,1);];
%WNN训练
[Net_wnn1,Net_wnn2,Weight_A,Weight_B,Weight_HA,Weight_HB,Num_H,Num_I,Num_O]=func_wnn_train(P_train,P_test,T_train,T_test);
%WNN预测
final = func_wnn_test(P_test,Net_wnn1,Net_wnn2,Weight_A,Weight_B,Weight_HA,Weight_HB,Num_H,Num_I,Num_O);
%转换为1~3
[V,I] = sort(final);
final2= final;
final2(I(1:20))  = 1;
final2(I(21:40)) = 2;
final2(I(41:60)) = 3;
disp('正确率:'); 
100*length(find(final2==T_test'))/length(T_test')
 
figure;
flag1 = final2(1:20);
for i = 1:20
    NAME = ['images\d\',num2str(100+i),'.jpg'];
    tmps = imread(NAME);
    subplot(6,10,i);
    imshow(tmps);
    if flag1(i) == 1
       title('识别正确','Color','b');
    else
       title('识别错误','Color','r');
    end
end
 
 
flag2 = final2(21:40);
for i = 1:20
    NAME = ['images\x\',num2str(100+i),'.jpg'];
    tmps = imread(NAME);
    subplot(6,10,20+i);
    imshow(tmps);
    if flag2(i) == 2
       title('识别正确','Color','b');
    else
       title('识别错误','Color','r');
    end
end