zoukankan      html  css  js  c++  java
  • 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

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

    分类: 开放项目

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

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

    --------------------------------------------------ImageMagick---------------------------------------------------

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

         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%以上了

  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/archoncap/p/4951728.html
Copyright © 2011-2022 走看看