標籤:
利用開來源程式(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)實現映像驗證碼識別