概述
我們在寫爬蟲腳本時,經常會遇到驗證碼阻礙我們的道路。特別是這個網站的資料又非常重要,所以不得不研究一下怎麼讓機器自動識別。對於一些不太複雜的驗證碼,我們可以直接用現成的開源引擎Tesseract識別。
如下面的圖片,數字還是很清晰,也沒有什麼偏轉,字母粘連也不是很嚴重。在實際測試中,基本50%以上的驗證碼可以一次通過。
Tesseract
就是開源引擎裏的執牛耳項目。起源於惠普實驗室並在1984-1994
年間大力發展的Tesseract,曾一度可與商業OCR軟件比肩。2005年,HP在GoogleCode
上將Tesseract開源,2006年開始由谷歌贊助,並由Ray Smith
負責該項目。
Tesseract支持的語言非常多,每種語言有相應的語言包可以下載。但是從中文的情況來看,貌似效果不是太好,識別率幾乎不可商用。相關論文中提到中文的準確率在95%以上,不知道實際的測試樣本是怎麼樣的。英文準確率還不錯,可以直接拿來用。這也是爲什麼這篇文章只能用於簡單的中英文驗證碼。
Tesseract 環境搭建
在Ubuntu下,你可以直接用 sudo apt-get install tesseract
來安裝。也可以按照這裏的步驟編譯安裝。【tesseract compiling】語言包一般放在 /usr/local/share/tessdata
或者 /usr/share/tessdata
中。比如 eng.traineddata
或者 chi-sim.traineddata
,也可以到這裏下載 【Tessdata】
預處理
下下來的圖片一般是不能直接拿來識別的,因爲引擎只認識灰度圖。所以我們要先預處理一下下。
轉換格式
用 imagemagick
轉換圖片格式 sudo apt-get install imagemagick
如要把一張 vcode.gif
的圖片轉化成 png
,則 mogrify -format png vcode.gif
這裏 mogrify
和 convert
命令其實是一樣的,只不過 mogrify
會覆蓋源文件罷了。(文檔裏是這麼說的,我也不知道爲啥要有兩個命令,捂臉~)
但是我們仍然得到的是彩色圖片,其實 imagemagick
還可以做更多,就像命令行的 photoshop
一樣,參考他的文檔,http://www.imagemagick.org/script/mogrify.php
OpenCV
但是介於對opencv很瞭解,我們這裏爲了方便,直接用opencv來處理後面的預處理工作。opencv要做的有三件事,轉化成灰度圖,二值化,裁剪。直接貼代碼吧!
#!/usr/bin/env python
# coding=utf-8
import cv2
import sys
if __name__ == '__main__':
img = cv2.imread(sys.argv[1], 0) # 讀取參數作爲文件名
adaptive = cv2.adaptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 自適應二值化
adaptive = adaptive[3:-3, 3:-3] # 去掉周圍的一點點邊界
cv2.imwrite('test.png', adaptive) # 存起來
識別
用命令行 tesseract test.png output
執行,結果會放在 output.txt
的文本中。當然,介於我們用了這麼多工具才能識別出來,最好用 shell 來組織一下,才能批量化工作。 各位讀者根據自己的需求取用吧!
參考資料:
1. Tesseract 在 googlecode上的項目,已停止更新,有一些資料,但是還是建議轉github
【http://tesseract-ocr.googlecode.com/】
2. Tesseract 在 GITHUB 上的項目
【https://github.com/tesseract-ocr/tesseract】
3. 如何編譯自己的Tesseract項目
【https://github.com/tesseract-ocr/tesseract/wiki/Compiling】
4. 各種語言的訓練包,直接拿來用
【https://github.com/tesseract-ocr/tessdata】
5. 現在Tesseract負責人Ray Smith 的介紹論文
【https://github.com/tesseract-ocr/docs/blob/master/tesseracticdar2007.pdf】
6. wiki上的簡介
【https://en.wikipedia.org/wiki/Tesseract_(software)】