python 中文识别 不用tesseract_Python——验证码识别 Pillow + tesseract-ocr
簡介
圖片驗證碼識別的可以分為幾個步驟,一般用 Pillow 庫或 OpenCV 來實現,這幾個過程是:
灰度處理&二值化
降噪
字符分割
標準化
識別
灰度化:在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫做灰度值,因此,灰度圖像每個像素值只需一個字節存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。
二值化:二值化可以把灰度圖片轉換成二值圖像,把大于某個臨界灰度值的像素灰度設置為灰度極大值,把小于這個值的像素灰度設為灰度極小值,從而實現二值化。
降噪就是把不需要的信息通通去除,比如背景,干擾線,干擾像素等等,只留下需要識別的字符,讓圖片變成2進制點陣,方便代入模型訓練。
灰度處理:
灰度化:在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫做灰度值,因此,灰度圖像每個像素值只需一個字節存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。
from PIL import Image # 用于打開圖片和對圖片處理
def img_to_gray(path):
"""
圖片轉灰度
:param path:
:return:
"""
img = Image.open(path)
img = img.convert('L') #轉灰度
img.show() #顯示圖片
return img
path = '../files/verifyimg_edit_1.jpg'
im = img_to_gray(path)
path = path.replace('jpg','png')
im.save(path) #保存圖片
處理前后的圖片:
輸入原始圖片:
輸出轉灰度后的圖片:
二值化:
二值化:二值化可以把灰度圖片轉換成二值圖像,把大于某個臨界灰度值的像素灰度設置為灰度極大值,把小于這個值的像素灰度設為灰度極小值,從而實現二值化。
from PIL import Image # 用于打開圖片和對圖片處理
def processing_image(path):
img = Image.open(path)
pixdata = img.load()
w, h = img.size
threshold = 160 # 該閾值不適合所有驗證碼,具體閾值請根據驗證碼情況設置
# 遍歷所有像素,大于閾值的為黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
return img
path = '../files/verifyimg_edit_1.png' #已經完成轉灰度的圖片
im = processing_image(path)
path = path.replace('png','jpeg')
im.save(path)
輸入轉灰度后的圖片:
輸出二值化后的圖片:
降噪
降噪就是把不需要的信息通通去除,比如背景,干擾線,干擾像素等等,只留下需要識別的字符,讓圖片變成2進制點陣,方便代入模型訓練。
from PIL import Image, ImageDraw
# 二值數組
t2val = {}
def twoValue(image, G):
for y in xrange(0, image.size[1]):
for x in xrange(0, image.size[0]):
g = image.getpixel((x, y))
if g > G:
t2val[(x, y)] = 1
else:
t2val[(x, y)] = 0
# 根據一個點A的RGB值,與周圍的8個點的RBG值比較,設定一個值N(0
# G: Integer 圖像二值化閥值
# N: Integer 降噪率 0
# Z: Integer 降噪次數
# 輸出
# 0:降噪成功
# 1:降噪失敗
def clearNoise(image, N, Z):
for i in xrange(0, Z):
t2val[(0, 0)] = 1
t2val[(image.size[0] - 1, image.size[1] - 1)] = 1
for x in xrange(1, image.size[0] - 1):
for y in xrange(1, image.size[1] - 1):
nearDots = 0
L = t2val[(x, y)]
if L == t2val[(x - 1, y - 1)]:
nearDots += 1
if L == t2val[(x - 1, y)]:
nearDots += 1
if L == t2val[(x - 1, y + 1)]:
nearDots += 1
if L == t2val[(x, y - 1)]:
nearDots += 1
if L == t2val[(x, y + 1)]:
nearDots += 1
if L == t2val[(x + 1, y - 1)]:
nearDots += 1
if L == t2val[(x + 1, y)]:
nearDots += 1
if L == t2val[(x + 1, y + 1)]:
nearDots += 1
if nearDots < N:
t2val[(x, y)] = 1
def saveImage(filename, size):
image = Image.new("1", size)
draw = ImageDraw.Draw(image)
for x in xrange(0, size[0]):
for y in xrange(0, size[1]):
draw.point((x, y), t2val[(x, y)])
image.save(filename)
path = u'../files/verifyimg_edit_二值化.jpg' #已經完成二值化的圖片
image = Image.open(path)
twoValue(image, 100)
clearNoise(image, 2, 1)
path1 = u'../files/verifyimg_edit_降噪11.jpg'
saveImage(path1, image.size)
輸入二值化后的圖片:
輸出降噪后圖片:
文字識別
def image_recognition(image):
'''
文字識別
:param image:
:return:
'''
pytesseract.pytesseract.tesseract_cmd = r"d:\Program Files\Tesseract-OCR\tesseract.exe" # 設置pyteseract路徑
result = pytesseract.image_to_string(image) # 圖片轉文字
print(result)
path = u'../files/verifyimg_edit_降噪11.jpg' #已經完成降噪的圖片
image = Image.open(path)
image_recognition(image)
輸出:6032
總結
以上是生活随笔為你收集整理的python 中文识别 不用tesseract_Python——验证码识别 Pillow + tesseract-ocr的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql编程的作用_数据库系统概论对学
- 下一篇: 博图如何读取mysql数据_博途使用小结