一、背景
最近有個需求是從一個后臺的留言網(wǎng)站爬取留言數(shù)據(jù),后臺管理網(wǎng)站必然涉及到了登錄,登錄就有個驗證碼的問題必須得解決,由于驗證碼是從后端生成的,并且不了解其生成規(guī)則,那就只能通過圖像識別技術(shù)來做驗證碼識別了!通過查閱資料發(fā)現(xiàn)Python中的的tesserocr這個庫好像使用的比較多,所以對這個庫進(jìn)行了一番研究,并且實現(xiàn)了那個后臺網(wǎng)站驗證碼的識別。
二、準(zhǔn)備工作
1. 安裝tesserocr
由于我使用的Python版本是python3.5,所以一下所有操作都是基于python3的,如果有python2的同學(xué),可以找找其他教程~~
首先需要下載tesseract,它為tesserocr提供底層支持。具體下載官方路徑:https://github.com/UB-Mannheim/tesseract/wiki,選擇對應(yīng)的系統(tǒng)版本,可以選擇一個相對不帶dev的穩(wěn)定版本下載,如:tesseract-ocr-setup-3.05.02-20180621.exe。然后一路安裝,唯一記得勾選Additional language data(download),勾選可能會用到的語言tessdata,如簡體、繁體中文,數(shù)學(xué)模塊等,不需要全選,下載tessdata的時間會比較長。
然后安裝python3對應(yīng)的tesserocr庫,通常我們安裝庫的方法是使用命令pip install tesserocr,但是這里會報錯:“error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools",這個時候不宜直接去下載Microsoft Visual C++ Build Tools,而是使用原始的whl文件方式安裝。tesserocr 的whl官方文件下載路徑:https://github.com/simonflueckiger/tesserocr-windows_build/releases,下載本地環(huán)境對應(yīng)的whl文件,如我的是window64位系統(tǒng),python版本是3.5。下載完后,使用cd跳轉(zhuǎn)到whl文件所在目錄,然后 執(zhí)行 ”pip installtesserocr-2.2.2-cp35-cp35m-win_amd64.whl“,即可輕松完成安裝。
緊接著用例子驗證如何使用:我們找到一個驗證碼圖片:image.jpg,下載到本地磁盤,用代碼進(jìn)行驗證:
import tesserocr
from PIL import Image
image=Image.open('image.jpg')
print(tesserocr.image_to_text(image))
不出意外,首次運行總是不順利,相信我遇到的坑大多數(shù)人都會遇到,大抵錯誤類似:
Traceback (most recent call last):
File "G:\pythonSources\my12306/obtain_message\test.py", line 4, in module>
print(tesserocr.image_to_text(image))
File "tesserocr.pyx", line 2400, in tesserocr._tesserocr.image_to_text
RuntimeError: Failed to init API, possibly an invalid tessdata path: “本地某個路徑”
有個比較簡單粗暴的解決方法是把安裝好的Tesseract-OCR下的tessdata文件夾整個拷貝到提示的那個路徑中,親測有效。
2. 安裝opencv
由于驗證碼需要做一些優(yōu)化處理,方便更加容易被tesserocr識別,所以需要使用opencv來做一些特殊的處理,安裝opencv比較簡單,直接pip install opencv-python即可。
三、識別過程
1. 將圖片變成黑白圖片
我需要爬取數(shù)據(jù)的這個后臺網(wǎng)站驗證碼是黃底白字的,這種色差較小的tesserocr識別起來比較困難,稍微試了一下,基本上沒怎么識別對過。。。所以我們需要先將圖片變成色差最大的黑白圖片。初始圖片見下圖:
首先,將圖片變成灰色,并將灰色圖片保存起來方便后續(xù)做對比,變成灰色以后的圖片如下:
變成灰色后,通過像素點的顏色值將灰色部分的背景變成白色,白色的具體內(nèi)容變成黑色,這樣白底黑字的黑白圖片就有了:
處理成黑白圖片的實現(xiàn)代碼如下:
img = Image.open(self.code_path)
# 將圖片變成灰色
img_gray = img.convert('L')
img_gray.save('../images/code_gray.png')
# 轉(zhuǎn)成黑白圖片
img_black_white = img_gray.point(lambda x: 0 if x > 200 else 255)
img_black_white.save('../images/code_black_white.png')
2. 去除圖片噪點
圖片轉(zhuǎn)成黑白以后,一些雜點也隨著我們的主體內(nèi)容變成了黑色的點,這樣對識別的效果也有較大的影響,所以需要想辦法將這些干擾點去掉。這里就需要借助opencv的功能了,在使用opencv去除噪點之前,需要先將圖片做灰值化以及二值化處理,具體代碼如下所示:
# opencv處理
img_cv = cv2.imread('../images/code_black_white.png')
# 灰值化
im = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
# 二值化
cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)
基本處理之后,就需要消除噪點了,消除噪點的原理也比較簡單,就是遍歷圖片的每一個像素點,找到其上下左右四個像素點位置的顏色,如果這四個點中白色點的數(shù)量大于2則說明這個點是噪點,需要將該點的顏色直接置為白色點,在邊框位置的像素點也直接置為白色,因為主要內(nèi)容一般都是在圖片中間的。以下為處理噪點的代碼:
# 噪點處理
def interference_point(img):
filename = '../images/code_result.png'
h, w = img.shape[:2]
# 遍歷像素點進(jìn)行處理
for y in range(0, w):
for x in range(0, h):
# 去掉邊框上的點
if y == 0 or y == w - 1 or x == 0 or x == h - 1:
img[x, y] = 255
continue
count = 0
if img[x, y - 1] == 255:
count += 1
if img[x, y + 1] == 255:
count += 1
if img[x - 1, y] == 255:
count += 1
if img[x + 1, y] == 255:
count += 1
if count > 2:
img[x, y] = 255
cv2.imwrite(filename, img)
return img, filename
噪點處理完畢之后,就是一張非常清晰的圖片了:
這個時候就可以直接使用tesserocr來識別了,具體識別的方式如下:
tesserocr.image_to_text(img_result)
識別測試結(jié)果如下:
經(jīng)過多次識別驗證測試,另外也由于這個驗證碼的字體相對比較規(guī)范,所以成功率是相當(dāng)?shù)母吡?,即使偶爾的一次失敗,我們也是可以進(jìn)行重試就又成功了。哈哈, 差不多就是這個樣子啦,歡迎大家指正文中的問題~~不多說了,我要去使用新學(xué)的技術(shù)去做“壞事”了!
到此這篇關(guān)于Python3使用tesserocr識別字母數(shù)字驗證碼的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python3 tesserocr識別字母數(shù)字驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python 實現(xiàn)任意區(qū)域文字識別(OCR)操作
- 如何使用Python進(jìn)行PDF圖片識別OCR
- python3.7中安裝paddleocr及paddlepaddle包的多種方法
- Python調(diào)用百度OCR實現(xiàn)圖片文字識別的示例代碼
- python圖片驗證碼識別最新模塊muggle_ocr的示例代碼
- 如何基于Python代碼實現(xiàn)高精度免費OCR工具
- 基于Python的OCR實現(xiàn)示例
- Python基于百度AI實現(xiàn)OCR文字識別
- python3安裝OCR識別庫tesserocr過程圖解
- python 如何做一個識別率百分百的OCR