1. 工具準備
- Tesseract-OCR引擎
該引擎由惠普公司開發(fā),2005年開源,之后由Google開發(fā)維護。可以用于識別簡單的驗證碼。
Linux下安裝:sudo apt-get tesseract-ocr
Windows下安裝:Tesseract-OCR下載鏈接
Python pytesseract 庫
pytesseract 是對 Tesseract-OCR 的一個封裝,方便我們在 Python 中調用 Tesseract-OCR 引擎。可以直接通過pip安裝。PIL(Python Imaging Library)/Pillow
PIL(Python Imaging Library)是Python常用的圖像處理庫,而Pillow是PIL的一個友好Fork,提供了了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。目前PIL只支持python2,而Pillow可以支持python3。安裝PIL比較麻煩,推薦使用Pillow,可以直接通過pip或者apt install來安裝。
2. 識別思路
首先對圖片做二值化來降噪處理,去掉圖片中的噪點,干擾線等。然后將圖片中的單個字符切分出來。最后識別每個字符。
圖片的處理,我采用 Python 標準圖像處理庫 PIL。圖片分割,我暫時采用谷歌開源庫 Tesseract-OCR。字符識別則使用 pytesseract 庫。
3. 代碼實現(xiàn)
3.1 獲取并打開圖片
獲取圖片驗證碼,你可以通過使用網(wǎng)絡請求庫下載。我為了方便,將圖片下載到本地并放在項目目錄下。
from PIL import Image
'''
獲取圖片
'''
def getImage():
fileName = '16.jpg'
img = Image.open()
# 打印當前圖片的模式以及格式
print('未轉化前的: ', img.mode, img.format)
# 使用系統(tǒng)默認工具打開圖片
# img.show()
return img
3.2 預處理
這一步主要是將圖片進行降噪處理, 把圖片從 "RGB" 模式轉化為 "L" 模式,也就是把彩色圖片變成黑白圖片。再處理掉背景噪點,讓字符和背景形成黑白的反差。
'''
1) 將圖片進行降噪處理, 通過二值化去掉后面的背景色并加深文字對比度
'''
def convert_Image(img, standard=127.5):
'''
【灰度轉換】
'''
image = img.convert('L')
'''
【二值化】
根據(jù)閾值 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 表示白, 其他數(shù)字表示不同的灰度。
在 PIL 中,從模式 “RGB” 轉換為 “L” 模式是按照下面的公式轉換的:
L = R 的值 x 299/1000 + G 的值 x 587/1000+ B 的值 x 114/1000
圖像的二值化,就是將圖像上的像素點的灰度值兩極分化(設置為 0 或 255,0表示黑,255表示白),也就是將整個圖像呈現(xiàn)出明顯的只有黑和白的視覺效果。目的是加深字符與背景的顏色差,便于 Tesseract 的識別和分割。對于閾值的選取,我采用比較暴力的做法,直接使用 0 和 255 的平均值。
3.3 識別
經(jīng)過上述處理,圖片驗證碼中的字符已經(jīng)變成很清晰了。
最后一步是直接用 pytesseract 庫識別。
import pytesseract
'''
使用 pytesseract 庫來識別圖片中的字符
'''
def change_Image_to_text(img):
'''
如果出現(xiàn)找不到訓練庫的位置, 需要我們手動自動
語法: 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)
# 去掉非法字符,只保留字母數(shù)字
textCode = re.sub("\W", "", textCode)
return textCode
Tesseract-ORC 默認是沒有指定安裝路徑。我們需要手動指定本地 Tesseract 的路徑。不然會報出這樣的錯誤:
FileNotFoundError: [WinError 2] 系統(tǒng)找不到指定的文件
具體解決方案是:
使用文本編輯器打開 pytesseract 庫的 pytesseract.py 文件,一般路徑如下:
D:\software\python\Lib\site-packages\pytesseract\pytesseract.py
將 tesseract_cmd 修改成你電腦本地的 Tesseract-OCR 的安裝路徑。
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
tesseract_cmd = 'D:\software\Tesseract-OC\tesseract.exe'
總結
Tesseract-ORC可以用于識別簡單的驗證碼,對于復雜的驗證碼可以考慮使用神經(jīng)網(wǎng)絡自己訓練驗證碼庫。