ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 84691|回复: 88

[分享] 【指路贴】网页采集教程第四课-验证码图片处理欣赏及使用tessdata-OCR进行训练和识别

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-24 02:01 | 显示全部楼层 |阅读模式
本帖最后由 liucqa 于 2012-11-24 01:38 编辑

第一课:http://club.excelhome.net/thread-893760-1-1.html
第二课:http://club.excelhome.net/thread-894527-1-1.html
第三课:http://club.excelhome.net/thread-896608-1-1.html
第四课:http://club.excelhome.net/thread-897117-1-1.html
第五课:http://club.excelhome.net/thread-899268-1-1.html

高级篇:
第一课:http://club.excelhome.net/thread-902266-1-1.html
第二课:http://club.excelhome.net/thread-939881-1-1.html



***************************我是指路的分割线************************************

验证码是识别自古以来就是魔道之争,数字、字母、黑白、彩色、加噪、干扰、倾斜、扭曲、交错等手段层出不穷。搞到最后,俺人工识别都要连换若干个图片才能看清楚具体字符了,对某些网站,俺简直已经无语了。


考虑在实际应用中,某些网站的自动登录、自动提交、自动获取等功能往往需要提交验证码,为此如何找到一种适合业余人士的识别验证码方法被俺提上计划解决的日程。经过一个月的等待和搜索,在某两位大神代码的基础上,俺用了2个晚上终于实验出了第一个作品。顺便将一些知识点写成第四课,供大家欣赏。


本文从业余使用的角度出发,采用开源的tessdata-OCR进行验证码的识别。此方法有利于快速上手,亦能缩短程序开发时间。

验证码图片的处理网上有许多文章,其内容大多类似。初级的处理包括中值滤波、灰度、二值化、去噪、旋转等;高级的就涉及一些算法,例如二值化的灰度阈值算法处理,边缘跟踪、边界检测、细化骨架、切割、神经网络等等。从讲课的实际出发,本文不涉及高级功能,那是学院派的工作。本课只讲解验证码处理的初级方法。

处理验证码的初级流程如下:
1、获取验证码图片。我在第三课中讲解了四种方法,其中WebBrowser是通用性最好的。
2、将图片转成BMP位图。这个建议通过Image控件进行,如果你的图片能放到控件里面,自然就成了位图了。需要注意的是VB不支持PNG格式的图片,处理这种格式需要其他办法。
3、将位图转成数组,开始处理
4、一般的简单验证码图片预处理顺序为:去边框、反转颜色、加权灰度、中值滤波、二值化、去噪点
5、将处理之后的数组转成图片
6、图片保存到硬盘
7、调用tessdata-OCR进行识别
8、如果识别的错误率较大,需要给tessdata-OCR做训练。


************************俺是欣赏的分割线*******************************

下面是某网站的验证码图片识别欣赏:

4.gif


12306的验证码去干扰线(基于八皇后算法)
http://club.excelhome.net/thread-948137-1-1.html


评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-24 02:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2012-7-28 18:24 编辑

拜托各位,如果您不具备搜索学习能力的话,还是淡定的飘过此帖吧... ...

谢谢各位的理解了!





关于如何将控件里面的图片转成数组,请看此帖,本文不对其中的代码做解释。
http://club.excelhome.net/forum.php?mod=viewthread&tid=400986&page=2#pid2561266

下面简单讲解一下验证码图片预处理的一些原理和算法
    去边框-----------将数组的边界数据根据去边框的要求,清空1~2个像素即可(填入255)
    反转颜色--------要处理RGB三色,用255-像素值即可
    中值滤波--------将图片每次取出4~8个点,将所有点的像素值进行排序,将这4~8个点的像素值换成排序在中间的值。要处理RGB三个值。
    加权灰度--------心理学的灰度公式 Gray= 0.299*R + 0.587*G + 0.114*B         
                             整数运算的变种公式 Gray = (R*30 + G*59 + B*11 + 50) / 100
                            Adobe RGB (1998) [gamma=2.20] Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2) 速度慢但是效果不错
    二值化-----------根据阈值确定像素值是0(黑),还是255(白),计算阈值的算法有多种,最简单的是取图片的平均灰度作为阈值。
                            复杂的是根据灰度出现的概率来判断阈值,例如OTSU算法。
    去噪点-----------一般需要2次去噪,第一次去掉单一像素的噪点,第二次去掉多像素堆积在一起的噪点。
                            最简单的方法是先后判断9、25个像素范围内白色像素的占比,如果超过60%~80%即可视为噪点。将中心像素填入255即可。

实际应用的时候,上面的算法需要根据实际情况进行调整,以适应不同的网站。特别是中值滤波,按照正方形、矩形、菱形等不同形状、不同大小作出来的滤波效果是不一样的,对二值化之后的效果有一定影响。
二值化算法的好坏,会直接影响后面去噪点的难易程度,因此为了迅速找到做二值化的最适合算法,给验证码图片做一个直方图来直观的进行观察是一个很常见的手段。

验证码图片预处理完毕之后,理论上还需要进行旋转扶正、投影分割,拆分出单个字符以备识别。
由于本课是使用OCR软件进行识别,拆分出单个字符的操作就由OCR负责处理了


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-24 02:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-10-31 21:37 编辑

图片处理完毕之后,下一步就是进行OCR识别。

tesseract-ocr软件已经被某大神前辈处理成COM控件,真是VBA的爱好者的福音。否则就得用shell调用了。
软件安装及调用说明见下贴
http://club.excelhome.net/thread-890820-1-1.html

如果直接使用tesseract-ocr软件的默认字库进行识别,会发现软件对该网站的验证码识别率很低,大约不到5%。因此,我们要给tesseract-ocr做训练,建立针对这个网站验证码图片的专用字库。

tesseract-ocr软件的训练方法见
http://my.oschina.net/lixinspace/blog/60124]http://my.oschina.net/lixinspace/blog/60124
工具下载:
http://sourceforge.net/projects/vietocr/files/jTessBoxEditor

简单整理归纳的训练步骤如下:
1、取得足够的验证码图片,要包括全部的字符。理论上每个字符的不同姿态包括的越全越好,但要注意可能会导致字符间的冲突。
2、将全部的图片用PS处理到一张大图上,并存成tif格式(字库名.tif)。jTessBoxEditor的Merge Tiff 工具貌似不太好使。
3、生成Box文件
4、用jTessBoxEditor加载 字库名.tif,对应的Box文件会被自动加载。然后人工修正错误的字符和切割位置。
myimg0.JPG
5、记事本建立font_properties文件,并且输入文本:    字库名 0 0 0 0 0
6、在Dos窗口执行若干命令,生成unicharset, inttemp, normproto, pfftable文件
7、加上前缀。前缀就是之前tif大图的名字,也是字库名
8、最后在Dos窗口执行命令生成字库。
9、将 字库名.traineddata 放到tesseract-ocr软件安装目录下的tessdata目录里即可。

调用的时候将参数中的字库换成用上述方法生成的字库名即可。strOcrMsg = FMyFuns.TsOcr(FullName, "3", "8", "0", "字库名")

为方便操作,我做了一个批处理,执行顺序如下:
    1.bat
    编辑Box文件
    编辑font_properties文件(确认字库名正确)
    2.bat
    3.bat
    4.bat
    5.bat
    加字库名前缀
    6.bat
然后将生成的 字库名.traineddata 文件放到tesseract-ocr软件安装目录下的tessdata目录里即可。

tesseract-ocr批处理.rar (964 Bytes, 下载次数: 1018)
附件中的字库名是"MyImg",字库生成之后可以自行改名。

tesseract-ocr使用训练之后生成的专用字库,对一楼演示的的某网站识别准确率可以达到100%。

jxyd.rar (42.39 KB, 下载次数: 926)
一楼演示的某网站验证码训练之后的字库

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-24 02:03 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-11 00:24 编辑

由于验证码识别是一把双刃剑,所以本课只提供操作指南和图片欣赏,不提供代码。
请有学习能力的会员,自行学习二楼中的链接,谢谢!



请欣赏直方图和两次降噪的效果
捕获.JPG

请欣赏自动阈值判断做二值化的效果:
3.gif

凑和弄了个12306的识别字库,准确率大约60~65%。这个网站的验证码使用边缘缺损的方法来避免被自动识别,但是因为大部分字母没有粘连,所以只要训练字库建的合适,识别准确率还是能做得比较高的。我估计超过70%应该没问题。
3.gif

http://club.excelhome.net/thread-947657-1-1.html
C#识别12306,可以达到或超过95%的识别率。------已失效

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-24 02:04 | 显示全部楼层
本帖最后由 liucqa 于 2012-11-3 12:35 编辑

第四课小结:

    本课讲解了验证码图片的预处理初级技术,以及使用开源的tessdata-OCR软件做验证码识别方法。


    验证码识别涉及到图像处理、人工智能、算法识别等专业领域。本文只是从初级处理的角度整理和收集了前人的一些劳动成果,并将自己在学习当中的一些收获告诉大家。如果哪位大神能够对本帖给予增强和补充,本人不胜感谢!

   

附几个网络上的文章
http://www.cnblogs.com/hsapphire/archive/2011/01/07/1929732.html
http://caca.zoy.org/wiki/PWNtcha



最后说明:
    鉴于论坛尚在哺乳期的奶瓶会员比较多,为避免俺给了程序之后还得管拍背打嗝,所以,请想研究图像识别的会员们,自行学习2楼中的链接。在小fish的代码里面已经很完整地给出了验证码图片识别所需要的全部基础代码,无需我再画蛇添足了,你所要做的工作就是在小fish的基础之上,自己添加中值滤波、自动阈值、二次降噪的代码,百度搜索可以找到一大堆。
    做初级验证码识别的大量时间是消耗在图像的预处理和字库的训练上,这点请会员们牢记。

因为不同的网站需要不同的预处理代码,如果您不具备搜索学习能力的话,俺的代码即使给你了也无法用到其他网站上,不过就是博君一笑而已。所以,俺打算只做一名指路人,就不陪着没断奶的童鞋们登山了,谢谢各位!



备注:
如果你直接把一行字符的图片放在tesseract中运行,返回的结果会有两个回车换行符。原因是tesseract识别结果的输出是以utf8编码的,并且在末尾加了两个回车符。所以对于一行文本的图像来说,应该要去掉这两个回车符
http://blog.csdn.net/caiqi1123/article/details/8002843
http://blog.csdn.net/caiqi1123/article/category/1103273

TA的精华主题

TA的得分主题

发表于 2012-7-24 02:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先分享了。。

TA的精华主题

TA的得分主题

发表于 2012-7-24 02:17 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-24 02:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
那我先排队了,注意休息。

TA的精华主题

TA的得分主题

发表于 2012-7-24 09:30 | 显示全部楼层
学习。
越来越 曲高和寡 了

TA的精华主题

TA的得分主题

发表于 2012-7-24 11:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 12:54 , Processed in 0.051580 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表