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