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

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

 

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别的更多相关文章

  1. tesseract ocr训练 pt验证码

    识别率有问题A大概率识别为n,因此需要训练,这里讲一下 如何训练 参考 java代码里边直接使用tess4j,是对tesseract的封装,但是如果要训练,还是需要在进行安装tesseract-ocr ...

  2. Java使用Java OCR API进行验证码识别

    Maven坐标: <!-- https://mvnrepository.com/artifact/com.asprise.ocr/java-ocr-api --> <dependen ...

  3. 基于pyteseract google ocr的图形验证码识别

    先灰化图片,把图片二值化,利用pytesseract包的pytesseract.image_to_string转换出文字.

  4. Python 3.6 版本-使用Pytesseract 模块进行图像验证码识别

    环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesse ...

  5. tesseract ocr文字识别Android实例程序和训练工具全部源代码

    tesseract ocr是一个开源的文字识别引擎,Android系统中也可以使用.可以识别50多种语言,通过自己训练识别库的方式,可以大大提高识别的准确率. 为了节省大家的学习时间,现将自己近期的学 ...

  6. 开源图片文字识别引擎——Tesseract OCR

    Tessseract为一款开源.免费的OCR引擎,能够支持中文十分难得.虽然其识别效果不是很理想,但是对于要求不高的中小型项目来说,已经足够用了. 文字识别可应用于许多领域,如阅读.翻译.文献资料的检 ...

  7. Python&selenium&tesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考

    在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位. 我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片 ...

  8. Tesseract OCR使用介绍

    #Tesseract OCR使用介绍 ##目录[TOC] ##下载地址及介绍 官网介绍:http://code.google.com/p/tesseract-ocr/wiki/TrainingTess ...

  9. [免费下载应用]iNeuKernel.Ocr 图像数据识别与采集原理和产品化应用

    目       录 1..... 应用概述... 2 2..... 免费下载试用... 2 3..... 视频介绍... 2 4..... iNeuLink.Ocr图像数据采集应用... 2 5... ...

随机推荐

  1. PHP常用函数总结(不定期更新)

    array_merge函数和两个数组相加的区别 array_merge函数,在出现相同的索引数组,会把两个数组中的索引数组,进行融合,以第一个数组的索引最大值往后相加,如果是关联数组,后面数组的值覆盖 ...

  2. C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?

    摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...

  3. mave web常用配置文件参数

    <build> <finalName>rte</finalName> <resources> <resource> <director ...

  4. 单片网络接口芯片W5100的原理与应用

    随着计算机网络技术的发展,作为全球最大计算机网络——I n t e r ac t已成为当今信息社会重要的基础信息设施.在工业测控.智能仪器.智能家庭等领域,大量应用嵌入式设备接人 I n t e r ...

  5. MVC中使用内建的HTML辅助方法产生表单元素提交表单与button按钮事件的陷阱

    网站模板页有个登陆的退出按钮,当点击时跳转到登陆页面. <button onclick="logout()" >退出</button> $("#l ...

  6. IOS 中列表的TableView 详解,常用方法整理

    一.创建一个列表,不管代码还是nib拖拉,在nib创建的时候,记得加他的二个代理 (UITableViewDelegate UITableViewDataSource) 代码创建的话,需要关联他的代理 ...

  7. django--静态文件(九)

    1.要加载静态文件需要配置: setting.py BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STA ...

  8. RabbitMQ消息机制广播分发

    public static void SendMessage() { var factory = new ConnectionFactory(); factory.HostName = "1 ...

  9. Func<T>、Action<T> 的区别于说明

    一.Func Func是一个.Net内置的委托. Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托. Func<TResult> ...

  10. C#笔试(程序设计)

    1.如何把一个Array复制到ArrayList里,如何把ArrayList复制到Array里? foreach( object o in array )arrayList.Add(o); Array ...