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

--------------------------------------------------低调的分割线---------------------------------------------------php

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

--------------------------------------------------ImageMagick---------------------------------------------------java

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

     ImageMagick是一个适用于建立、编辑和组合位图的软件。它可以读、写和转换超过百余种格式的图片。编程

  另外,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是一个开源软件,以可运行的二进制文件和源代码两种方式发布。你能够在公开和私有的程序中随意地使用、复制、修改和分发它。它基于Apache 2.0风格的协议发布。工具

  其次,貌似ImageMagick的官方网站是被功夫墙了的(这但是纯技术的网站啊!),因此咱们没法直接去获取该程序,这里是国内的下载测试

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

--------------------------------------------------tesseract-ocr---------------------------------------------------网站

  先来介绍下tesseract-ocr,老规矩,英文原文源于官方网站

  tesseract-ocr是一个OCR(Optical Character Recognition,光学字符识别)引擎,最初由惠普实验室在1985到1995年间开发维护,如今归Google管了。

  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,咱们须要作的只有两步:

       命令行下 convert.exe -compress none -depth 8 -alpha off code.gif code.tif
    命令行下  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://code.google.com/p/tesseract-ocr/downloads/detail?name=chi_sim.traineddata.gz&can=2&q=

而后找到tessdata目录,把eng.traineddata替换为chi_sim.traineddata,而且把chi_sim.traineddata重命名为eng.traineddata

ok,如今中文识别基本达到90%以上了

相关文章
相关标签/搜索