【验证码识别】基于遗传算法优化OUST结合BP神经网络实现数字验证码识别含Matlab源码
1 简介
本项目基于MATLAB完成数字验证码识别的GUI设计,图像处理,验证码生成、识别等功能。采用BP神经网络来实现对验证码图像的识别。验证码的识别,大概分为图片预处理、分割字符、识别字符三个过程,其中分割字符最为困难。本文采用基于遗传算法和最大熵优化的图像分割技术、大津法(OTSU)、自定义阈值三种技术进行字符分割,并作进一步分析。利用英国萨里大学提供的印刷体数字数据集,共10160张图片,90%的数据用于训练BP神经网络,剩余10%的数据用于测试,最终识别准确率达到93.47%,利用训练所得BP模型完成识别字符,最终验证码图像识别效果较佳。
2 部分代码
创建数据集
buildataset: 用来创建神经网络适合的训练集
function [inputs outputs] = builddataset(pathname,handles)
创建数据集
pathname='D:\课程\计算智能\BP数字验证码\img\';
file = dir(pathname); %除去“.”“..”两个文件夹
file_num = size(file,1)-2;
temp = cat(1,strvcat(file(10).name,file.name));
class = temp(4:13,:);
inputs = [];
outputs = [];
for i = 1:file_num
pathName = [pathname,class(i,:),'\'];
temp_png = dir([pathName,'\*.png']);
temp_imgName = cat(1,strvcat(temp_png(10).name,temp_png.name));
pic_num = size(temp_png,1);
imgName = temp_imgName(2:pic_num+1,:); %得到文件夹内pic_num张图片的名称
for j = 1:pic_num
I2 = 1 - im2bw(imread([pathName,imgName(j,:)]),0.9); % 转换为二值图像并反转
L= bwlabel(I2,8); %找到图中的连通域,num为连通域数量
imgsize = size(L);
Idx = zeros(1,4);
flag = 0;
for k = 1 : imgsize(1, 1)
if size(find(L(k,:) == 1))==[1 0]
flag_temp = false;
else
flag_temp = true;
end
if flag == 0 && flag_temp
k-1; =
flag = 1;
end
if flag == 1 && ~flag_temp
k; =
flag = 2;
end
if k == imgsize(1, 1) && flag == 1
k; =
flag = 2;
end
end
flag = 0;
for k = 1 : imgsize(1, 2)
if size(find(L(:,k) == 1))==[0 1]
flag_temp = false;
else
flag_temp = true;
end
if flag == 0 && flag_temp
k-1; =
flag = 1;
end
if flag == 1 && ~flag_temp
k; =
flag = 2;
end
if k == imgsize(1, 2) && flag == 1
k; =
flag = 2;
end
end
for k=1:4
if Idx(1,k) == 0
1; =
end
end
t = I2(Idx(1,1):Idx(1,2), Idx(1,3):Idx(1,4));
I2 = imresize(t,[32,32]); %缩放至32*32
I2 = im2bw(I2,0.5);
axes(handles.axes1);
if j == 200
j;
end
imshow(I2);
n]=size(I2);
A=reshape(I2',[1 m*n]); %将I2矩阵变为1行m*n列的矩阵i
inputs=[inputs;A];
B=zeros(1,file_num);
1; =
outputs = [outputs;B];
end
end
save inputs.mat inputs;
save outputs.mat outputs;
'提示');
end
3 仿真结果
4 参考文献
[1]王盟. 基于遗传算法优化BP神经网络的手写体字母识别[D]. 河北科技大学, 2016.