爬蟲、Selenium、webUI自動化使用PIL+pytesseract識別驗證碼以及識別錯誤解決方案

背景:
大家在做爬蟲或web端的UI自動化時會經常遇到的就是驗證碼,那怎麼識別這驗證碼也是我們目前遇到的難題。(在這裏咱們先不討論:1.點擊類的驗證 2.滑動類的驗證 3.中文類的驗證)
簡單地說,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區分,面積計算,體積計算,扭曲變形校正。對於顏色則有色彩空間的計算與轉換,圖形上色,陰影,色差處理等等。

環境:
Python3.7
PIL
pytesseract

1、安裝Python3.7
2、安裝PIL庫
3、安裝pytesseract庫

思路:
1、圖片降噪

2、圖片切割

3、圖像文本輸出

3.1 圖片降噪

所謂降噪就是把不需要的信息通通去除,比如背景,干擾線,干擾像素等等,只剩下需要識別的文字,讓圖片變成2進制點陣最好。

對於彩色背景的驗證碼:每個像素都可以放在一個5維的空間裏,這5個維度分別是,X,Y,R,G,B,也就是像素的座標和顏色,在計算機圖形學中,有很多種色彩空間,最常用的比如RGB,印刷用的CYMK,還有比較少見的HSL或者HSV,每種色彩空間的維度都不一樣,但是可以通過公式互相轉換。在RGB空間中不好區分顏色,可以把色彩空間轉換爲HSV或HSL。色彩空間參見:http://baike.baidu.com/view/3427413.htm

識別驗證碼圖片如下:
在這裏插入圖片描述
代碼:

1、打開圖片轉化成灰度

import pytesseract
from PIL import Image

#1、導入Image包,打開圖片
im = Image.open('1.jpg')

#2、把彩色圖像轉化爲灰度圖像。RBG轉化到HSI彩色空間,採用L分量:
imgry = im.convert('L')
imgry.show()

轉化成灰度效果如下:(還是比較模糊不能很好的被識別)
在這裏插入圖片描述
2、二值化處理

二值化是圖像分割的一種常用方法。在二值化圖象的時候把大於某個臨界灰度值的像素灰度設爲灰度極大值,把小於這個值的像素灰度設爲灰度極小值,
從而實現二值化(一般設置爲0-1)。根據閾值選取的不同,二值化的算法分爲固定閾值和自適應閾值,這裏選用比較簡單的固定閾值。
把像素點大於閾值的設置,1,小於閾值的設置爲0。生成一張查找表,再調用point()進行映射。

threshold = 140
table = []

for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
out = imgry.point(table, '1')
out.show()

二值化處理後的效果如圖:

在這裏插入圖片描述
解決問題:

第一個錯誤:

1.FileNotFoundError:[WinError 2] 系統找不到指定的文件The system cannot find the file specified:

解決方案:

方案1:將tesseract.exe添加到系統的環境變量path中

方案2:修改pytesseract.py文件,指定tesseract.exe安裝路徑打開pytesseract的安裝目錄(這是我的目錄:C:\Users\Administrator\venv\Lib\site-packages\pytesseract)找到並打開: pytesseract.py文件

註釋掉原本的:

#tesseract_cmd=‘tesseract’

新增tesseract_cmd 爲tesseract.exe的安裝路徑

tesseract_cmd= ‘D:\Program Files\Tesseract-OCR\tesseract.exe’
在這裏插入圖片描述
這樣系統找不到指定的文件這個錯誤就可以解決了。

第二個錯誤:

2.解決上面的問題後運行代碼又出錯:

pytesseract.pytesseract.TesseractError: (1, 'Error opening data file C:\\Program Files (x86)\\Tesseract-OCR\\tessdata/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language \'eng\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')

在這裏插入圖片描述

解決方案:

在代碼中添加:

pytesseract.pytesseract.tesseract_cmd = 'c://Program Files (x86)//Tesseract-OCR//tesseract.exe'

tessdata_dir_config = '--tessdata-dir "c://Program Files (x86)//Tesseract-OCR//tessdata"'

然後在指定的image_to_string配置下

image_to_string(image, lang = 'eng', config=tessdata_dir_config)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章