1. 程式人生 > 其它 >python對驗證碼進行降噪後使用tesserocr識別

python對驗證碼進行降噪後使用tesserocr識別

技術標籤:爬蟲python影象識別爬蟲資料探勘opencv

使用tesserocr庫可以識別圖片驗證碼,我們以一個簡單的圖片驗證碼為例,來演示這個流程
在這裡插入圖片描述
因為驗證碼中噪點、干擾線以及顏色的干擾,我們不能直接使用tesserocr庫來識別驗證碼,先要對驗證碼進行去噪操作

將驗證碼轉換為灰度圖片

#獲取圖片物件
img = Image.open("demo.jpg")
#轉換為灰度圖片
imgGary = img.convert('L')
#檢視圖片
imgGray.show()

在這裡插入圖片描述

將灰度圖片二值化

獲取所有畫素點,並將小於閾值threshold的,轉換為黑色。大於閾值轉換為白色。這裡我閾值設定的是165,可以根據實際情況自己設定

#設定閾值
threshold = 165
#載入畫素點
pixdata = imgGray.load()
#獲取圖片的寬高
width, height = imgGray.size
for y in range(height):
    for x in range(width):
        if pixdata[x, y] < threshold:
            pixdata[x, y] = 0
        else:
            pixdata[x, y] = 255
#檢視圖片
binImg  = imgGray
binImg .show()

在這裡插入圖片描述

對二值化的圖片進行降噪

此時我們已經消除了顏色的干擾,接下來我們使用八鄰域降噪來消除噪點和干擾線。
因為噪點和干擾線大多是獨立且零散的,所以我們檢查每一個畫素點,當畫素點的八個相鄰的畫素點中有超過4個空白的畫素點,那麼我們就認為這是一個噪點,並刪除這個噪點
降噪可以多次進行

#載入畫素點
pixdata = binImg.load()
#獲取圖片寬高
width, height = binImg.size
for y in range(1, height- 1):
    for x in range(1, width- 1):
        count = 0
        # 上
        if
pixdata[x, y - 1] > 245: count = count + 1 # 下 if pixdata[x, y + 1] > 245: count = count + 1 # 左 if pixdata[x - 1, y] > 245: count = count + 1 # 右 if pixdata[x + 1, y] > 245: count = count + 1 # 左上 if pixdata[x - 1, y - 1] > 245: count = count + 1 # 左下 if pixdata[x - 1, y + 1] > 245: count = count + 1 # 右上 if pixdata[x + 1, y - 1] > 245: count = count + 1 # 右下 if pixdata[x + 1, y + 1] > 245: count = count + 1 #消除噪點 if count > 4: pixdata[x, y] = 255 #檢視圖片 nrImg = binImg nrImg.show()

可以發現降噪效果非常明顯
在這裡插入圖片描述

使用tesserocr識別驗證碼

#識別降噪後的圖片
ans = tesserocr.image_to_text(nrImg)
#消除空白字元
ans.strip()
#列印
print(ans)

成功識別
在這裡插入圖片描述

完整程式碼

import tesserocr
from PIL import Image

#獲取圖片img物件
def getImg(path):
    img = Image.open(path)
    return img

#將彩色圖片轉換為灰度圖片
def toGrayImg(img):
    imgGary = img.convert('L')
    return imgGary

#將灰度圖片二值化
def toBinImg(imgGray, threshold=165):
    pixdata = imgGray.load()
    width, height= imgGray.size
    for y in range(height):
        for x in range(width):
            if pixdata[x, y] < threshold:
                pixdata[x, y] = 0
            else:
                pixdata[x, y] = 255
    return imgGray

#對圖片進行降噪,可進行多輪降噪
def noiseReduction(binImg):
    pixdata = binImg.load()
    width, height = binImg.size
    for y in range(1, height- 1):
        for x in range(1, width- 1):
            count = 0
            # 上
            if pixdata[x, y - 1] > 245:
                count = count + 1
            # 下
            if pixdata[x, y + 1] > 245:
                count = count + 1
            # 左
            if pixdata[x - 1, y] > 245:
                count = count + 1
            # 右
            if pixdata[x + 1, y] > 245:
                count = count + 1
            # 左上
            if pixdata[x - 1, y - 1] > 245:
                count = count + 1
            # 左下
            if pixdata[x - 1, y + 1] > 245:
                count = count + 1
            # 右上
            if pixdata[x + 1, y - 1] > 245:
                count = count + 1
            # 右下
            if pixdata[x + 1, y + 1] > 245:
                count = count + 1
            if count > 4:
                pixdata[x, y] = 255
    return binImg

def dealImg(path):
    img = getImg(path)
    grayImg = toGrayImg(img)
    binImg = toBinImg(grayImg)
    return noiseReduction(binImg)

def readVerificationCode(path):
    img = dealImg(path)
    print(tesserocr.image_to_text(img))

if __name__ == '__main__':
    readVerificationCode("demo.jpg")