轉自http://muyublog.appspot.com/2010/09/9/imagemagick-tesseract-recognize-verify-code.html
開源的力量是巨大的,借助于斯,我這個對驗證碼一竅不通的人也可以識别出很多基礎的驗證碼了。
--------------------------------------------------低調的分割線---------------------------------------------------
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象素高度。