记一个验证码识别程序实现

问题描述

昨天看到有人在v2ex上问如何接口访问http://www.shjtaq.com/zwfg/dzjc_new.asp网站。其实就是后台实现查询这个网站上的信息。

实现这个功能的第一步可能就是需要识别这个验证码,做到表单自动提交。

想起来了以前识别京东价格时候的一点实现。看这个验证码应该很简单。所以,计划自己实现一个简单的可以识别这个验证码的程序。

遇到的问题

刚开始下载了几个验证码来做模版。计划把从0到9的图像数据分别保存下来。作为识别其他验证码时候的比较对象。

验证码是一个bmp图片。40x10像素的。10x10是一个数字的大小。所以写代码把bmp图片的数据部分以300Byte分为4个文件。

在搜集了0到9的数据文件之后。尝试识别。

发现更本无法识别出验证码。这是怎么回事呢?

刚开始以为图片内置了噪音之类的影响因素。开始看opencv,看是否有更好的办法。发现很复杂。

后来使用imagemagick将1571.bmp切出来了第一个1和最后一个1。比较了一下这两个文件,发现是一样的。

但是为什么我拆分出来的数据确实不一样的呢?

为此,还下载了imagemagick的源代码,计划看看它是如何切割bmp文件的。

苦思一会儿之后,想起来很多年前处理bmp图像的时候。记得bmp图像的数据部分并不是从左到右,从上到下存储的。而是逆序的。具体怎么逆序,忘了。

上网查了一下wiki:https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_.28bitmap_data.29

果然,bmp图像数据是从左下角开始存储的。从左到右的。所以在拆分图像的时候需要仔细处理。我直接把前300Byte认为是第一个数字的图像信息是完全错误了。

问题解决

处理好了bmp文件数据部分内容的正确读取之后,模版做好。识别程序也做好。

为了简化比较过程,在读取模版文件之后,将数据做了2值化。把需要识别的图片的数据部分也做了2值话,这样比较的部分更简单。

代码见:https://github.com/miwoow/easy_captcha.git

优化

可以把图片信息转成灰度值。这样比较的量会缩小很多。代码中已经有rgb2gray代码。但是现在没有使用。

联系我:

Email: xudongsecret@qq.com

===完===