python對驗證碼進行降噪後使用tesserocr識別
阿新 • • 發佈:2020-12-21
使用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")