利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

作者: admin 分类: 屏幕取词 发布时间: 2013-04-18 13:34 ė10,529 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

开源的力量是巨大的,借助于斯,我这个对验证码一窍不通的人也可以识别出很多基础的验证码了。

————————————————–低调的分割线—————————————————

Linux下有两个重要的编程准则,甚至是设计哲学,就是:模块原则(使用简洁的借口拼合简单的部件)和组合原则(设计时考虑拼接组合)。在Linux下面有无数个小程序,体积小,功能简单。但是当我们将它们按一定的方式组合起来以后,它们 几乎无所不能。命令行的一个很大的好处就是方便组合。试想一下你要处理一万个文本文件,并替换其中的部分内容,如果是使用图形界面的Word,恐怕没有人能够干的下来。   今天我们要用到两个开源软件:ImageMagick+tesseract-ocr。

————————————————–ImageMagick—————————————————

首先是一点简介(英文原文源于官方网站):

ImageMagick® is a software suite to create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (over 100).   ImageMagick是一个适用于创建、编辑和组合位图的软件。它能够读、写和转换超过百余种格式的图片。

The functionality of ImageMagick is typically utilized from the command line or you can use the features from programs written in your favorite programming language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), L-Magick (Lisp), NMagick (Neko/haXe), MagickNet (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick (Tcl/TK).    另外,ImageMagick针对主流的编程语言都有借口,包括G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), L-Magick (Lisp), NMagick (Neko/haXe), MagickNet (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), 和 TclMagick (Tcl/TK)。当然,你也可以通过命令行的方式将它与其它程序组合起来。

ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you may freely use, copy, modify, and distribute in both open and proprietary applications. It is distributed under an Apache 2.0-style license.   ImageMagick是一个开源软件,以可运行的二进制文件和源代码两种方式发布。你可以在公开和私有的程序中随意地使用、复制、修改和分发它。它基于Apache 2.0风格的协议发布。

其次,貌似ImageMagick的官方网站是被功夫墙了的(这可是纯技术的网站啊!),所以我们无法直接去获取该程序,这里是国内的下载

最后是安装,没的什么说的,最简单一路next就可以,当然你也可以改改安装目录啥的。放心,没有捆绑百度工具栏的~

————————————————–tesseract-ocr—————————————————

先来介绍下tesseract-ocr,老规矩,英文原文源于官方网站(你没有点错,这个网站是没有被墙的):

An OCR Engine that was developed at HP Labs between 1985 and 1995… and now at Google.   tesseract-ocr是一个OCR(Optical Character Recognition,光学字符识别)引擎,最初由惠普实验室在1985到1995年间开发维护,现在归Google管了。

The Tesseract OCR engine was one of the top 3 engines in the 1995 UNLV Accuracy test. Between 1995 and 2006 it had little work done on it, but it is probably one of the most accurate open source OCR engines available. The source code will read a binary, grey or color image and output text. A tiff reader is built in that will read uncompressed TIFF images, or libtiff can be added to read compressed images.    tesseract-ocr引擎曾是1995年UNLV准确度测试中最顶尖的三个引擎之一。在1995年到2006年期间,它几乎没有什么改动,但是它可能仍然是现在最准确的开源OCR引擎之一。它(原文是source code,源代码,应该是笔误)会读取二进制的灰度或者彩色的图像,并输出文字。一个内建的tiff阅读器让它可以读取未压缩的TIFF图像,但是如果要读取压缩过的TIFF图像,它还需要一个附加的libtiff库。

由于官方没有被封,直接在官网就可以下载了。我们需要下载tesseract-2.04.exe.tar.gz和tesseract-2.00.eng.tar.gz。tesseract-2.04.exe.tar.gz是主程序。tesseract-2.00.eng.tar.gz是识别英文和数字需要用的特征库,有点类似于杀毒软件的病毒库。tesseract-ocr还可以识别荷兰语、西班牙语和德语等等等等,我们用不着就不用下了。

最后,这个软件是不用安装的,解压就可以用了。先解压tesseract-2.04.exe.tar.gz,然后解压tesseract-2.00.eng.tar.gz的内容到tesseract的根目录,就可以了。如果解压tesseract-2.00.eng.tar.gz的位置没有放好,运行tesseract 会出错:Unable to load unicharset file ./tessdata/eng.unicharset。

—————————————————验证码识别—————————————————-

两个软件的关系:

tesseract是图盲,默认情况下只能看得懂未压缩的TIFF图像,如果直接用tesseract处理其它格式的图片,会报错如下:     Tesseract Open Source OCR Engine     name_to_image_type:Error:Unrecognized image type:code.jpg     IMAGE::read_header:Error:Can’t read this image type:code.jpg     tesseract:Error:Read of file failed:code.jpg

所以我们需要用ImageMagick来转换图片格式,当然ImageMagick还有其它用处。

假设需要识别的图片验证码为code.jpg,我们需要做的只有两步:

d:\ImageMagick\convert.exe -compress none -depth 8 -alpha off ./code.gif ./code.tif     D:\\tesseract\\tesseract.exe ./code.tif ./result

OK,结果就在文本文件./result.txt里面了,tesseract会自动地在./result后面添加上后缀名.txt。然后再对两个命令做点解释。

convert.exe:ImageMagick套件的一部分,负责图片格式转换,各个参数的意义如下:     -compress none:转换后的图片不要压缩,如果没有加这一项,后续tesseract处理的时候会报错:read_tif_image:Error:Illegal image format:Compression     -depth 8:设置转换后图像的色深为8位,也就是bpp为8。如果没有此参数,后果如下:       Tesseract Open Source OCR Engine       check_legal_image_size:Error:Only 1,2,4,5,6,8 bpp are supported:16       Segmentation fault     -alpha off:在转换后的图像中不要添加alpha图层。如果没有此参数,后果同上。      紧跟着就是待转换的图片的文件名,最后是转换后的图片的文件名。

tesseract.exe:OCR就这样被我们“滥用”做验证码识别了~。     ./code.tif:待识别的图像     ./result:存放结果的文件的文件名,tesseract会自动在其后添加后缀.txt。

就这么简单,仅仅两个命令,验证码的内容就乖乖地在result文件中等我们了。

—————————————————-优化大法—————————————————–

黄师傅的博客看到了一些可能的优化方法(未验证),记录如下:

为提高识别率,可以先把图片转换为灰度。即弄黑白的:在convert的时候加上参数-monochrome(单色,非黑即白)或者-colorspace Gray(灰度图,黑的程度还会不一样哦,效果会好点)。

做放大处理(以150%为例):convert in.tif -scale 150% in2.tif

如果要裁剪图像,使用参数-crop从一个图片截取一个指定区域的子图片【参见这里】。格式如下:-crop widthxheight{+-}x{+-}y{%},width 子图片宽度,height 子图片高度,x 为正数时为从区域左上角的x坐标,为负数时,左上角坐标为0,然后从截出的子图片右边减去x象素宽度,y 为正数时为从区域左上角的y坐标,为负数时,左上角坐标为0,然后从截出的子图片上边减去y象素高度。



只回答业务咨询点击这里给我发消息 点击这里给我发消息

王牌软件,兼职软件设计,软件修改,毕业设计。

本文出自 王牌软件,转载时请注明出处及相应链接。

本文永久链接: http://www.softwareace.cn/?p=366

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量