下面是我对验证码识别步骤的分析
一、预处理
1、读入一幅图像(彩色),对其进行灰度化
RGB系统中一个颜色值由3个分量组成,这样的图像称为彩色图像,RGB系统称为颜色空间模型。
灰度化的方法有一下几种:
g (x,y)=[ R(x,y)+ G(x,y)+ B(x,y)] / 3
g (x,y)= 0.11*R(x,y)+ 0.59*G(x,y)+ 0.3* B(x,y)
g (x,y) = Min (R(x,y), G(x,y), B(x,y))
2、二值化处理
一般24位RGB图像的灰度图是8位256个灰度级的,如果把这个灰度级减少到1位2个灰度级,就得到一副二值图,二值图像中的数据全部是0或1。
实现代码:
g_max=double(max(max(I1))); %最大值换成双精度数据
g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3.5); % T 为二值化的阈值
[m,n]=size(I1);
I2=(double(I1)>=T);
subplot(223);imshow(I2);title('二值化');
二、字符分割
字符分割包括从验证码图像中分割出字符区域和把字符区域划分成单个字符两个部分。
简单的分割方法包括等距分割、积分投影分割、交叉点分割、求连通区等。其中,粘连字符的分割是一个难点,复杂的粘连情况下分割比较困难,是一个硬人工智能问题。
我在做分割时用到的方法:区域生长法(只用于数字、字母且不粘连的情况,可以把单个字符分割出来)、投影法。
区域生长代码实现:
for i=1:4
I=double(d)/255;
[y,x]=getpts; %获得区域生长起始点
y1=round(x); %横坐标取整
x1=round(y); %纵坐标取整
[M,N]=size(I); %获取图像大小
stack=[y1,x1]; %将生长起始点灰度值存入stack中
suit=1; %储存符合区域生长条件的点的个数
Y=zeros(M,N); %作一个全零与原图像等大的图像矩阵Y,作为输出图像矩阵
Y(y1,x1)=1; %将种子点的灰度值置1
count=1; %记录每次判断一点周围八点符合条件的新点的数目
threshold=0.05555; %阈值
sum=I(y1,x1); %存灰度值
adaptM=stack(1,1);
adaptN=stack(1,2);
greyvalue=I(adaptM,adaptN);
while suit>0
adaptM=stack(1,1);
adaptN=stack(1,2);
for u=-1:1 %在围围八点找符合条件的点
for v=-1:1
if adaptM+u<(M+1) & adaptN+u>0 & adaptN+v<(N+1) & adaptN+v>0
if abs(I(adaptM+u,adaptN+v)-greyvalue)<=threshold & Y(adaptM+u,adaptN+v)==0
suit=suit+1;
stack(suit,1)=[adaptM+u]; %把符合点的坐标存入堆栈
stack(suit,2)=[adaptN+v];
Y(adaptM+u,adaptN+v)=1; %符合点灰度值置1
count=count+1;
sum=sum+I(adaptM+u,adaptN+v); %累加灰度值
end
end
end
end
greyvalue=sum/count; %获新种子点的灰度值
stack=stack(2:1:suit,:); %栈内存放所有符合条件点的坐标
suit=suit-1; %减去suit初始值
end
figure,imshow(Y),title('分割后图像');
imwrite(Y,num2str(i),'i.jpg');
三、字符识别
基于字符分割的识别(包括采用神经网络、SVM、各种统计距离的识别法)和模板匹配法识别。
模板匹配
原理思想:将待识别字符与字符模板做同样的归一化处理,然后遍历与字符模板比较,处理方法为先和字符模板做差,然后计算做差后的图像的总像素值,如果小于每一个阈值,则表示该待识别字符和该模板是同一个字符,这样就完成了一次识别。
循环对要识别的字符做同样的处理就可以识别出所有的字符,将结果保存在字符串中。
BP神经网络:
BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(outputlayer)。
BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。
BP神经网络模型BP网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型
参考:
博客园
http://www.cnblogs.com/chaosimple/archive/2013/07/18/3197720.html
字符识别的两种方法: 模板匹配、BP神经网络
这个博客里详细讲了模板匹配和BP神经网络的识别原理且代码详细
http://blog.csdn.net/zhubenfulovepoem/article/details/6803150/