Python OCR識別圖片驗證碼(二)

HuangZhang_123發表於2017-05-31

作業系統:Windows
Python:3.5
歡迎加入學習交流QQ群:657341423


上節講到驗證碼的簡單識別

但對於一些複雜的驗證碼,我們需要做一些簡單的圖片處理才能識別。

例如,我要識別這些驗證碼:
這裡寫圖片描述

設計思路:首先將圖片變灰,然後轉為RGBA,即四個通道,每個通道代表每種顏色,這個涉及到圖片處理的一些基礎知識。這個可以研究一下opencv。這個比較有意義。然後判斷通道的顏色來轉換成黑白色彩。便於OCR識別。

from PIL import Image
from PIL import ImageEnhance
from PIL import ImageFilter  
import sys
import os  
import pytesseract
from pyocr import tesseract
import time

def eachFile(filepath):
	pathDir =  os.listdir(filepath)
	for allDir in pathDir:
		child = os.path.join('%s%s' % (filepath, allDir))
		if "jpg" in child:
			jpgList.append(child)

def OutCode(code):
	file=open(SettingFile+"data.txt",'w')
	file.write(code)
	file.close()
	print (code)

# 黑白反色,白色替換  
# 此處N直接為255  
# 小於N的 被替換成黑色  
# 大於等於N的 被替換成白色,255代表白色,0代表黑色
if __name__=='__main__':
	while 1:
		SettingFile="D:\\"
		jpgList=[]
		eachFile(SettingFile)
		for i in jpgList:
			try:
				im = Image.open(i)
				im=im.convert('L')#圖片轉換為灰色影象
				im=im.convert('RGBA')#圖片轉換成RGBA模式
				pixdata = im.load()

				for y in range(im.size[1]):
					for x in range(im.size[0]):
					#迴圈影象裡的每一個畫素。每個畫素為一個長度為4的列表。因為圖片轉換成RGBA模式,所以列表長度為4,A就是透明度
							if pixdata[x,y][0]>170 and pixdata[x,y][1]>170 and pixdata[x,y][2]>170 and pixdata[x,y][3]>170:
								pixdata[x,y]=(255, 255, 255, 0)
							else:  
								pixdata[x,y]=(0, 0, 0, 0)
								
				im.save("asa.png")
				#下面code與註釋的code實現的功能一樣
				#code=pytesseract.image_to_string(im)
				code=tesseract.image_to_string(im)
				OutCode(code)
				os.remove(i)
			except Exception as e:
				code="Unrecognized"
				OutCode(code)
				os.remove(i)
		time.sleep(5)

這裡我設計一個死迴圈,每隔五秒檢測d盤下的jpg檔案,然後輸出識別後的結果。測試結果:
這裡寫圖片描述

如圖所示:asa.png為處理後的圖片。然後給OCR識別。
(建議將圖片改為png格式)
當然,這個OCR識別永遠都是有一定的準確率。這個是無法改變的。

相關文章