之前同样的验证码用java识别过,文章为地址为http://blog.csdn.net/q651742112/article/details/76405504
最近在学习matlab,就用它实现一下
验证码样本如下:
验证码采集地址:http://www.quanjing.com/createImg.aspx
识别思路:这个验证码比较规则,数字都是显示在固定的区域,数字也无粘连,实现步骤如下
1.对图像进行分割,分割成一个图像显示一个数字
2.对每个图像进行灰化处理,就是设置一个阈值将他们变成黑白图片
3.建立一个标准的数字图像库
4.将每个被分割的小图片与标准库比较,像素点重合最多的就是该数字
结果图:
matlab实现代码如下:
d=imread('D:\image\VerificationCode\123\12.jpg'); %读取图片
%===================标准图片================================
s=rand(12,9,10); %建立三维数组存放标准数字的像素点(有点长,关键代码在下面)
s(:,:,1)=[1 1 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字0
s(:,:,2)= [1 1 1 0 0 0 1 1 1;
1 1 0 0 0 0 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 0 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;];%数字1
s(:,:,3)=[1 1 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 0 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 1 1 1 1 0 0 1 1;
1 1 1 1 1 0 0 1 1;
1 1 1 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1;
1 0 0 0 1 1 1 1 1;
1 0 0 1 1 1 1 1 1;
0 0 0 0 0 0 0 1 1;
0 0 0 0 0 0 0 1 1];%数字2
s(:,:,4)=[1 1 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 1 1 1 0 0 1 1;
1 1 1 1 1 0 0 1 1;
1 1 1 0 0 0 0 1 1;
1 1 1 0 0 0 0 1 1;
1 1 1 1 1 0 0 1 1;
1 1 1 1 1 0 0 1 1;
0 1 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字3
s(:,:,5)=[1 1 1 1 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 1 0 0 0 1 1 1;
1 1 0 0 0 0 1 1 1;
1 0 0 0 1 0 1 1 1;
0 0 0 1 0 0 1 1 1;
0 0 1 1 0 0 1 1 1;
0 1 0 0 0 0 1 1 1;
0 0 0 0 0 0 0 1 1;
1 0 0 0 0 0 0 1 1;
1 1 1 1 0 0 1 1 1;
1 1 1 1 0 0 1 1 1];%数字4
s(:,:,6)=[1 1 0 0 0 0 0 1 1;
1 0 0 0 0 0 0 1 1;
0 0 0 1 1 1 1 1 1;
0 0 0 1 1 1 1 1 1;
0 0 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
1 1 1 1 1 0 0 1 1;
1 1 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 0 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字5
s(:,:,7)=[ 1 1 0 0 0 0 1 1 1;
1 0 0 0 0 0 1 1 1;
1 0 1 1 1 0 0 1 1;
0 0 1 1 1 1 1 1 1;
0 0 0 0 0 0 1 1 1;
0 0 0 0 0 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字6
s(:,:,8)=[ 0 0 0 0 0 0 0 1 1;
0 0 0 0 0 0 0 1 1;
1 1 1 1 0 0 0 1 1;
1 1 1 1 0 0 1 1 1;
1 1 1 0 0 1 1 1 1;
1 1 1 0 0 1 1 1 1;
1 1 1 0 1 1 1 1 1;
1 1 0 0 1 1 1 1 1;
1 1 0 0 1 1 1 1 1;
1 1 0 0 1 1 1 1 1;
1 1 0 1 1 1 1 1 1;
1 1 0 1 1 1 1 1 1];%数字7
s(:,:,9)=[ 1 1 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 0 0 0 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 0 0 0 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字8
s(:,:,10)=[1 1 0 0 0 1 1 1 1;
1 0 0 0 0 0 1 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 0 1 1;
1 1 0 0 0 0 0 1 1;
0 1 1 1 1 0 0 1 1;
0 0 1 1 1 0 0 1 1;
1 0 0 0 0 0 1 1 1;
1 1 0 0 0 1 1 1 1];%数字9
%==========================标准图片建立结束======================
result=zeros(1,4);%用来存放识别的结果
I=rgb2gray(d); %灰度化原始图片
I(I>140)=255; %设置阈值,大于140为白色,小于140为白色
I(I<140)=0;
%==========================识别数字开始=====================
for m=1:4 %循环读取验证码里面的四个数字
I1=im2bw(imcrop(I,[-1+m*9 6 8 11]),graythresh(imcrop(I,[-1+m*9 6 8 11])) ); %二值化图片,函数里面包括图片的分割
t=zeros(1,10);%存放与标准图片比较的各个数字的结果
for n=1:10 %循环与0到9数字做比较
T1=I1+s(:,:,n);%与标准相加
for i=1:12 %循环遍历各个像素点
for j=1:9
if(T1(i,j)==0) %等与0表示像素点相等
t(1,n)=t(1,n)+1; %存放结果
end
end
end
end
[x,y]=max(t);%获取比较结果数组最大值的坐标
result(1,m)=y-1;%将最接近的数字存在结果数组中
end
imshow(d);%显示原始图片
title({'识别的结果为',result}); %显示结果
hold on
注意:该网站下载的验证码格式为gif,可转换为jpg识别