感谢大家的支持! 目前,该公众号已启动评论消息功能。 你们对各条推文的留言和提问,可以通过【写评论】给圈主留言。 圈主马上回复你的信息。
要查看以前的文章,请单击右上角,关注并确认历史消息。 谢谢您的支持。
该推文主要识别的认证码是该:
第一步骤:二值化
二值化是指去除背景、噪声线、噪声像素等所有不需要的信息,仅留下应识别的文字,使图像成为二进制点。
步骤:字符分割
为了识别文字,需要分割识别的文字图像,将各文字作为单独的图像来处理。
步骤:标准化
一些特殊的验证码需要对分割的图像进行标准化。 也就是说,必须尽量使相同的字符采用相同的形式,减少随机性。 最简单的是旋转还原,复杂的点是扭曲还原等。 例如,在本文分割的数字1和8的宽度不一致的情况下,使它们的宽度一致是标准化的一种。
可以看到,上面剪切后的字符1的最右列的像素都是0。
步骤:学习认识
这个步骤有很多种方法,最简单的是模板比较,对出现的每个字符进行处理,使点成为字符串,指示是什么样的字符后,通过字符串比较来判断相似度。
在文章的后半部分详细说明我采用的算法。
训练集学习tran.m
width=132; height=20;
%共计10张验证码x 11个数字加起来分割成110张文字图像
%每个字符图像的高度20 x宽9,共180像素
data=zeros (110,180 );
chars=zeros (180,10 ); 用于存储字符数字的固有值为每个字符20x9
for name=0:9
im=imread(sprintf('%d.jpg ',name ) ); %读取图像
im=im2bw(im )==0; %第一步:将黑色1白0二值化
%步骤2 :拆分
布莱克=sum (im )~=0; 如果从上向下合计x132矩阵而1x132不为0,则在与横坐标对应的一列中有字符像素
wite=sum(im )==0; 如果将x132矩阵从上到下合计为1x132,则与横坐标相对应的列中没有字符像素
lower=find(min([black0],[1 white] ); 获取字符的开头下标
UPER=find(min([0black],[white 1] )- 1; 获取字符的结束下标
for i=1:11
ch=im(:lower(I ) :upper(i ) I ); %将剪切一个字符
ch (20,9 )=0; %步骤3 :将字符二值化矩阵的大小标准化为20x9
数据(name * 11i, )=ch ) : %字符图像数据存储在data中
结束
结束
%步骤4 :学习认识
class=集群数据(数据,10 ); 将110个字符的图像分为10种
%对应于每个分类号的实际数字(由人识别并填写---- () ) ) ) ) ) ) ) ) )
num=[5 3 6 8 9 0 7 2 1 4];
for i=1:10
%各类别的文字图像取平均值
im=mean (数据(class==I, ) ) 0.5;
chars(3360,num(I )1)=im; %存储
结束
验证码识别ocr.m
function ret=ocr (文件名)
加载;
ret=zeros (1,11 );
im=imread(filename;
im=im2bw(im )==0; %第一步:二值化
%步骤2 :拆分
布莱克=sum (im )~=0;
wite=sum(im )==0;
lower=find(min([black0],[1 white] );
UPER=find(min([0black],[white 1] )- 1;
for i=1:11
ch=im(:lower(I ) :upper(i ) I );
ch=ch(3360;
ch(180 )=0; %步骤3标准化
%步骤4 :识别
[~,num]=max(sum(min(repmat(ch,1,10 ),chars ) )
ret(I )=num-1;
结束
结束
过去的文章
量化投资和机器学习
知识、能力、深度、专业
勤奋、天赋、耐得住寂寞