【验证码识别】基于遗传算法优化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_numpathName = [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_numI2 = 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;elseflag_temp = true;endif flag == 0 && flag_temp= k-1;flag = 1;endif flag == 1 && ~flag_temp= k;flag = 2;endif k == imgsize(1, 1) && flag == 1= k;flag = 2;endendflag = 0;for k = 1 : imgsize(1, 2)if size(find(L(:,k) == 1))==[0 1]flag_temp = false;elseflag_temp = true;endif flag == 0 && flag_temp= k-1;flag = 1;endif flag == 1 && ~flag_temp= k;flag = 2;endif k == imgsize(1, 2) && flag == 1= k;flag = 2;endendfor k=1:4if Idx(1,k) == 0= 1;endendt = I2(Idx(1,1):Idx(1,2), Idx(1,3):Idx(1,4));I2 = imresize(t,[32,32]); %缩放至32*32I2 = im2bw(I2,0.5);axes(handles.axes1);if j == 200j;endimshow(I2);n]=size(I2);A=reshape(I2',[1 m*n]); %将I2矩阵变为1行m*n列的矩阵iinputs=[inputs;A];B=zeros(1,file_num);= 1;outputs = [outputs;B];endendsave inputs.mat inputs;save outputs.mat outputs;'提示');end
3 仿真结果
4 参考文献
[1]王盟. 基于遗传算法优化BP神经网络的手写体字母识别[D]. 河北科技大学, 2016.
