利用開源程序(ImageMagick+tesseract-ocr)實現圖像驗證碼識別

轉自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象素高度。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章