识别验证码

用imagemagick和tesseract-ocr破解简单验证码

 

 

Tesseract是Ray Smith 于1985到1995年间在惠普布里斯托实验室开发的一个OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2006年,Google邀请Smith加盟,重启该项目。目前项目的许可证是Apache 2.0。

  该项目目前支持Windows、Linux和Mac OS等主流平台。但作为一个引擎,它只提供核心功能,没有界面。

 

  有兴趣参加该项目的同学,可以加入:http://groups.google.com/group/tesseract-dev/,或者与Smith联系。


下载工具:imagemagick + tesseract-ocr

 

Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊。

准备工作:

1.安装tesseract-ocr

1 sudo apt-get install tesseract

2.安装imagemagick

1 sudo apt-get install imagemagick

3.安装rmagick

1 sudo apt-get remove --purge librmagick-ruby-doc librmagick-ruby1.8
2 sudo apt-get install libmagick9-dev ruby1.8-dev
3 sudo gem install rmagick

b4235ae9-bc2e-3d6c-8f28-af953d214667.jpg
先试一个简单的:

1 require 'rubygems'
2 require 'rtesseract'
3 img = RTesseract. new ( "tmp/test.jpg" )
4 img.to_s.sub(/\s+$/, "" ) # => "3R8Z"

很成功,但这个太简单了。一般破解复杂点的验证码处理步骤是先用imagemagick灰度化,灰度反转,提高对比度,二值化等。然后再用ocr去识别。ocr识别黑白图片效果比较好些。

这个的验证码:q1.jpg

1 img = MiniMagick::Image. new ( "tmp/people.jpg" )
2 img.colorspace( "GRAY" ) #灰度化
3 image = RTesseract. new (img.path)
4 image.to_s.sub(/\s+$/, "" ) # => "254369"

这个还是简单,再复杂一点的,这个验证码:b81f5445-edbc-3cb2-8e6a-31ceb99a93a2.jpg

有黑色边框,有背景色,文字稍微扭曲。

1 img = MiniMagick::Image. new ( "tmp/4399.jpg" )
2 img.crop( "#{img[:width] - 2}x#{img[:height] - 2}+1+1" ) #去掉边框(上下左右各 1 像素)
3 img.colorspace( "GRAY" ) #灰度化
4 img.monochrome #二值化
5 image = RTesseract. new (img.path) #ocr识别
6 image.to_s.sub(/\s+$/, "" ) #=> "5692"

像上面这样简单的识别率几乎能达到80%以上,扭曲太严重的识别率就很低了。有轻微噪点的就得自己写去噪算法了。。

 

 

破解图片验证码限制的一般思路:

http://www.williamlong.info/archives/347.html

 

你可能感兴趣的:(验证码)