简单验证码识别(matlab)

验证码识别, matlab

昨天晚上一个朋友给我发了一些验证码的图片,希望能有一个自动识别的程序。

1474529971027.jpg

我看了看这些样本,发现都是很规则的印刷体数字,而且还没有角度旋转,所以我就直接使用数字的面积和周长两个特征量来进行检测,发现效果还是蛮不错的。

在实验中,主要问题是‘6’和‘9’两个数字的面积和周长都是完全一样的,所以这时候我又添加了一个重心的特征。

有些蛋疼的是数字‘4’和‘0’竟然面积是一样的。。。所以只好再引入椭圆离心率特征来判别。

图像也没有怎么预处理,就是简单的阈值化,再使用ostu分割。

具体代码如下

  1. d=dir('*.jpeg'); %读jpeg文件 

  2. %% 预设模板,每一行对应一个数字 

  3. FD=[56,35.3137084989848,0.651415462867714; 

  4. 45,41.6568542494924,0.928960924132855; 

  5. 47,53.4558441227157,0.873324561446361; 

  6. 54,57.4558441227157,0.842543936832893; 

  7. 52,35.3137084989848,0.773979329527851; 

  8. 57,56.9705627484771,0.828808732648540; 

  9. 61,47.2132034355964,0.727827684501222; 

  10. 35,41.5563491861041,0.892307587953152; 

  11. 65,36.9705627484771,0.799839490167419; 

  12. 61,47.2132034355964,0.727827684501222; 

  13. ]; 


  14. for i=1:64 

  15. Im=imread(d(i).name); 

  16. I=rgb2gray(Im); %灰度化 

  17. I(I>140)=255; %简单阈值化,去除大面积背景干扰,这个再精细的话可以划分bins,将较大的bins过滤掉。 

  18. level=graythresh(I); 

  19. Ib=im2bw(I,level); %二值化 

  20. cc=bwconncomp(~Ib); %寻找闭合区域 

  21. L=labelmatrix(cc); %分配目标标签 

  22. area=regionprops(L,'Area'); %获得目标面积 

  23. area=[area(:).Area]; 

  24. perimeter=regionprops(L,'Perimeter'); %获得目标周长 

  25. perimeter=[perimeter(:).Perimeter]; 

  26. Ecc=regionprops(L,'Eccentricity'); %获得目标离心率 

  27. ecc=[Ecc(:).Eccentricity]; 

  28. centroid=regionprops(L,'Centroid'); %获得目标中心 

  29. str=''; 

  30. for j=1:length(area) 

  31. if perimeter(j)>30 %进一步去除小噪声干扰 

  32. nump=[area(j),perimeter(j),ecc(j)]; 

  33. dis=sum((repmat(nump,10,1)-FD).^2,2); 

  34. [~,Ind]=min(dis); 

  35. if Ind==7||Ind==10  

  36. % 数字6和9通过竖直方向上的中心判定,这个能用的原因在于数据中数字都是一行上的,平均中心应该在一半高度位置 

  37. cet=centroid(j).Centroid; 

  38. if cet(2)<size(Ib,1)/2; 

  39. Ind=10; 

  40. else 

  41. Ind=7; 

  42. end 

  43. end 

  44. str=[str,num2str(Ind-1)]; 

  45. end 

  46. end 

  47. subplot(8,8,i),imshow(Im);title(str);hold on 


  48. end 

部分实验结果

1474530849067.jpg

1474531012987.jpg

代码里主要函数


功能:regionprops(英文get the properties of region)用来度量图像区域属性的函数.常用来统计被标记的区域的面积分布,显示区域总数。

语法:STATS = regionprops(L,properties)

描 述:测量标注矩阵 L中每一个标注区域的一系列属性。L 中不同的正整数元素对应不同的区域, 例如:L 中等于整数1的元素对应区域1;L 中等于整数2的元素对应区域2;以此类推。

返回值STATS 是一个长度为 max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。 properties 可以是由逗号分割的字符串列表,包含字符串的单元数组,单个字符串 'all' 或者 'basic'。如果 properties 等于字符串 'all',则所有下述字串列表中的度量数据都将被计算,如果properties 没有指定或者等于 'basic',则属性 'Area'、'Centroid' 和'BoundingBox' 将被计算。

'Area'图像各个区域中像素总个数

  'BoundingBox' 包含相应区域的最小矩形

  'Centroid' 每个区域的质心(重心)

  'MajorAxisLength' 与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下)

  'MinorAxisLength' 与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)

  'Eccentricity' 与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)

  'Orientation' 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)

  'Image' 与某区域具有相同大小的逻辑矩阵

  'FilledImage' 与某区域具有相同大小的填充逻辑矩阵

  'FilledArea' 填充区域图像中的on像素个数

  'ConvexHull' 包含某区域的最小凸多边形

  'ConvexImage' 画出上述区域最小凸多边形

  'ConvexArea' 填充区域凸多边形图像中的on像素个数

  'EulerNumber' 几何拓扑中的一个拓扑不变量——欧拉数

  'Extrema' 八方向区域极值点

  'EquivDiameter' 与区域具有相同面积的圆的直径

  'Solidity' 同时在区域和其最小凸多边形中的像素比例

  'Extent' 同时在区域和其最小边界矩形中的像素比例

  'PixelIdxList' 存储区域像素的索引下标

  'PixelList' 存储上述索引对应的像素坐标

  'Perimeter' 图像各个区域边界地区的周长

  


总结

这个问题里面的样本实在是太简单,对于有旋转的,大小不同的数字验证码识别应该对数字提取旋转不变的特征点信息,以及离心率,方向像素直方图等多种信息融合才能得到较好结果。

另外还有一点就是图像的预处理,因为更复杂的验证码包含各种噪声,这就要求字符检测器有更好的鲁棒性。

简单验证码识别(matlab)的更多相关文章

  1. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  2. HNUSTOJ-1696 简单验证码识别(模拟)

    1696: 简单验证码识别 时间限制: 2 Sec  内存限制: 128 MB 提交: 148  解决: 44 [提交][状态][讨论版] 题目描述 验证码是Web系统中一种防止暴力破解的重要手段.其 ...

  3. 基于TensorFlow的简单验证码识别

    TensorFlow 可以用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 生成验证码 首先生成验证码,这里使用 Pyth ...

  4. Python3 简单验证码识别思路及实例

    1.介绍 在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码.滑块验证码.识图验证码.语音验证码等四种.本文就是识图验证码,识别的是简单的验证码,要想让识别率更高, 识别的更加准确就需要 ...

  5. windows下简单验证码识别——完美验证码识别系统

    此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...

  6. python简单验证码识别

    在学习python通过接口自动登录网站时,用户名密码.cookies.headers都好解决但是在碰到验证码这个时就有点棘手了:于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的 ...

  7. 简单验证码识别 tessnet2

    今天突然间对识别验证码感兴趣,于是网上搜了一下 最简单的是引用tessnet2.dll,然后通过它来识别,代码如下 private void button1_Click(object sender, ...

  8. python 验证码识别示例(五) 简单验证码识别

    今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wscx.gjxfj.gov.cn/zfp/webroot/xfs ...

  9. python 验证码识别示例(四) 简单验证码识别

    今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wsxf.mca.gov.cn/zfp/Random.cmd?d= ...

随机推荐

  1. stm32——NFC芯片--PN532的使用

    stm32——NFC芯片--PN532的使用 一.NFC简介 NFC(Near Field Communication)近场通信,是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内 ...

  2. 55. Jump Game leetcode

    55. Jump Game Total Accepted: 95819 Total Submissions: 330538 Difficulty: Medium Given an array of n ...

  3. Codeforces Round #327 (Div. 2)B(逻辑)

    B. Rebranding time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  4. Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  5. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  6. proxifier 代理bluestack

    proxycap 可以很方便的代理bluestack, 但是proxycap 的破解版现在越来越不好用了,而且不小心还会中个病毒,这个时候免费的proxifier就显得更加的可爱了. 但是有个问题,就 ...

  7. go 入门之环境搭建-Windows

    网上有很多关于go的环境配置的文章,都没有说出关键点.对于一个新人来说,请使用IDE,而不是sublime text,vim之类的文本编辑器.当然,当你上手之后,可以随便玩. 笔者这里推荐新人使用 L ...

  8. ObCallback回调钩子检测

    ObCallback回调钩子检测 2013-12-20 Nie.Meining Ring0 在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 ...

  9. 汇编指令CLI/STI

    CLI禁止中断发生STL允许中断发生 这两个指令只能在内核模式下执行,不可以在用户模式下执行:而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的 ...

  10. 初识WCF

    以前,总是说自己的基础知识不牢靠,就是因为自己总是不总结.昨天,学费交了,顿时感觉不一样了,心里有劲也有力了,知道了以前的自己到底为什么会那样了,因为没有压力. --题记 我参加过浩哥的招标项目,参加 ...