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

來源:互聯網
上載者:User

標籤:

利用開來源程式(ImageMagick+tesseract-ocr)實現映像驗證碼識別分類: 開放項目2012-07-23 17:28 6712人閱讀 評論(0) 收藏 舉報tiffimagecompression引擎pascalcharacter

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

   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)實現映像驗證碼識別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.