標籤:安裝路徑 思路 files 圖片下載 再處理 編輯器 取圖 下載失敗 系統
目前,很多網站為了防止爬蟲肆意類比瀏覽器登入,採用增加驗證碼的方式來攔截爬蟲。驗證碼的形式有多種,最常見的就是圖片驗證碼。其他驗證碼的形式有音頻驗證碼,滑動驗證碼等。圖片驗證碼越來越進階,識別難度也大幅提高,就算人為輸入也經常會輸錯。本文主要講解識別弱圖片驗證碼。
1 圖片驗證碼強度
圖片驗證碼主要採用加幹擾線、字元粘連、字元扭曲方式來增強識別難度。
加幹擾線也分為兩種,一種是線條跟字元同等顏色,另一種則線條的顏色是五顏六色。
各個字元之間的間隔比較小,互相依靠,能以分割。
字元顯示的位置相對標準旋轉一定角度。
其中最弱的驗證碼為不具備以上的特徵,幹擾因素比較小。如下:
2 識別思路
首先對圖片做二值化來降噪處理,去掉圖片中的噪點,幹擾線等。然後將圖片中的單個字元切分出來。最後識別每個字元。
圖片的處理,我採用 Python 標準影像處理庫 PIL。圖片分割,我暫時採用Google開源庫 Tesseract-OCR。字元識別則使用 pytesseract 庫。
3 安裝
我使用的 Python 版本是 3.6, 而標準庫 PIL 不支援 3.x。所以需要使用 Pillow 來替代。Pillow 是專門相容 3.x 版本的 PIL 的分支。使用 pip 包管理工具安裝 Pillow 是最方便快捷的。
pip install Pillow# 如果出現因下載失敗導致安裝不上的情況,建議使用代理pip --proxy http://代理ip:連接埠 install Pillow
Tesseract:開源的OCR識別引擎,初期Tesseract引擎由HP實驗室研發,後來貢獻給了開源軟體業,後經由Google進行改進,消除bug,最佳化,重新發布。這才讓其重煥新生。
我們可以在 GitHub 上找到該庫並下載。我是下載最新的 4.0 版本。
github 的是:https://github.com/tesseract-ocr/tesseract/wiki/4.0-with-LSTM#400-alpha-for-windows
pytesseract 是 Tesseract-OCR 對進行封裝,提供 Python 介面的庫。同樣可以使用 pip 方式來安裝。
pip install pytesseract# 如果出現因下載失敗導致安裝不上的情況,建議使用代理pip --proxy http://代理ip:連接埠 install pytesseract
4 代碼實現4.1 擷取並開啟圖片
擷取圖片驗證碼,你可以通過使用網路請求庫下載。我為了方便,將圖片下載到本地並放在項目目錄下。
from PIL import Image‘‘‘擷取圖片‘‘‘def getImage(): fileName = ‘16.jpg‘ img = Image.open() # 列印當前圖片的模式以及格式 print(‘未轉化前的: ‘, img.mode, img.format) # 使用系統預設工具開啟圖片 # img.show() return img
4.2 預先處理
這一步主要是將圖片進行降噪處理, 把圖片從 "RGB" 模式轉化為 "L" 模式,也就是把彩色圖片變成黑白圖片。再處理掉背景噪點,讓字元和背景形成黑白的反差。
‘‘‘1) 將圖片進行降噪處理, 通過二值化去掉後面的背景色並加深文字對比‘‘‘def convert_Image(img, standard=127.5): ‘‘‘ 【灰階轉換】 ‘‘‘ image = img.convert(‘L‘) ‘‘‘ 【二值化】 根據閾值 standard , 將所有像素都置為 0(黑色) 或 255(白色), 便於接下來的分割 ‘‘‘ pixels = image.load() for x in range(image.width): for y in range(image.height): if pixels[x, y] > standard: pixels[x, y] = 255 else: pixels[x, y] = 0 return image
開啟彩色圖片,PIL 會將圖片解碼為三通道的 “RGB” 映像。調用 convert(‘L‘) 才會把圖片轉化為黑白圖片。其中模式 “L” 為灰色映像, 它的每個像素用 8 個bit表示, 0 表示黑, 255 表示白, 其他數字表示不同的灰階。
在 PIL 中,從模式 “RGB” 轉換為 “L” 模式是按照下面的公式轉換的:
L = R 的值 x 299/1000 + G 的值 x 587/1000+ B 的值 x 114/1000
映像的二值化,就是將映像上的像素點的灰階值兩極分化(設定為 0 或 255,0表示黑,255表示白),也就是將整個映像呈現出明顯的只有黑和白的視覺效果。目的是加深字元與背景的顏色差,便於 Tesseract 的識別和分割。對於閾值的選取,我採用比較暴力的做法,直接使用 0 和 255 的平均值。
4.3 識別
經過上述處理,圖片驗證碼中的字元已經變成很清晰了。
最後一步是直接用 pytesseract 庫識別。
import pytesseract‘‘‘使用 pytesseract 庫來識別圖片中的字元‘‘‘def change_Image_to_text(img): ‘‘‘ 如果出現找不到訓練庫的位置, 需要我們手動自動 文法: tessdata_dir_config = ‘--tessdata-dir "<replace_with_your_tessdata_dir_path>"‘ ‘‘‘ testdata_dir_config = ‘--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"‘ textCode = pytesseract.image_to_string(img, lang=‘eng‘, config=testdata_dir_config) # 去掉非法字元,只保留字母數字 textCode = re.sub("\W", "", textCode) return textCode
Tesseract-ORC 預設是沒有指定安裝路徑。我們需要手動指定本地 Tesseract 的路徑。不然會報出這樣的錯誤:
FileNotFoundError: [WinError 2] 系統找不到指定的檔案
具體解決方案是:
使用文字編輯器開啟 pytesseract 庫的 pytesseract.py 檔案,一般路徑如下:
C:\Program Files (x86)\Python35-32\Lib\site-packages\pytesseract\pytesseract.py
將 tesseract_cmd 修改成你電腦本地的 Tesseract-OCR 的安裝路徑。
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLYtesseract_cmd = ‘C:/Program Files (x86)/Tesseract-OCR/tesseract.exe
最後執行字元識別的執行個體代碼
def main(): img = convert_Image(getImage(fileName)) print(‘識別的結果:‘, change_Image_to_text(img))if __name__ == ‘__main__‘: main()
運行結果如下:
未轉化前的: RGB JPEG識別的結果: 9834
5 總結
Tesseract-ORC 對於這種弱驗證碼識別率還是可以,大部分字元能夠正確識別出來。只不過有時候會將數字 8 識別為 0。如果圖片驗證碼稍微變得複雜點,識別率大大降低,會經常識別不出來的情況。我自己也嘗試收集 500 張圖片來訓練 Tesseract-ORC,識別率會有所提升,但識別率還是很低。
如果想要做到識別率較高,那麼需要使用 CNN (卷積神經網路)或者 RNN (迴圈神經網路)訓練出自己的識別庫。正好機器學習很火爆很流行,學習一下也無妨。
轉自:https://cloud.tencent.com/developer/article/1187805
Python學習交流群:548377875
猴哥
Python 實現識別弱圖片驗證碼