python驗證碼識別

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)絡自己訓練驗證碼庫。

參考鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容