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

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

分類: 開放項目

--------------------------------------------------低調的分割線---------------------------------------------------php

   Linux下有兩個重要的編程準則,甚至是設計哲學,就是:模塊原則(使用簡潔的藉口拼合簡單的部件)和組合原則(設計時考慮拼接組合)。在Linux 下面有無數個小程序,體積小,功能簡單。可是當咱們將它們按必定的方式組合起來之後,它們 幾乎無所不能。命令行的一個很大的好處就是方便組合。試想一下你要處理一萬個文本文件,並替換其中的部份內容,若是是使用圖形界面的Word,恐怕沒有人 可以乾的下來。
  今天咱們要用到兩個開源軟件:ImageMagick+tesseract-ocrhtml

--------------------------------------------------ImageMagick---------------------------------------------------java

  首先是一點簡介(英文原文源於官方網站):chrome

     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就能夠,固然你也能夠改改安裝目錄啥的。放心,沒有捆綁百度工具欄的~post

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

相關文章
相關標籤/搜索