摘要:在上一篇博客圖像處理之圖片文字識別中我們介紹了在中如何利用軟件來識別圖片中的英文與中文,本文將具體介紹如何在中利用軟件來識別驗證碼數字加字母。
??在上一篇博客Python圖像處理之圖片文字識別(OCR)中我們介紹了在Python中如何利用Tesseract軟件來識別圖片中的英文與中文,本文將具體介紹如何在Python中利用Tesseract軟件來識別驗證碼(數字加字母)。
??我們在網上瀏覽網頁或注冊賬號時,會經常遇到驗證碼(CAPTCHA),如下圖:
本文將具體介紹如何利用Python的圖像處理模塊pillow和OCR模塊pytesseract來識別上述驗證碼(數字加字母)。
??我們識別上述驗證碼的算法過程如下:
將原圖像進行灰度處理,轉化為灰度圖像;
獲取圖片中像素點數量最多的像素(此為圖片背景),將該像素作為閾值進行二值化處理,將灰度圖像轉化為黑白圖像(用來提高識別的準確率);
去掉黑白圖像中的噪聲,噪聲定義為:以該點為中心的九宮格的黑點的數量小于等于4;
利用pytesseract模塊識別,去掉識別結果中的特殊字符,獲得識別結果。
??我們的圖片如下(共66張圖片):
??完整的Python代碼如下:
import os import pytesseract from PIL import Image from collections import defaultdict # tesseract.exe所在的文件路徑 pytesseract.pytesseract.tesseract_cmd = "C://Program Files (x86)/Tesseract-OCR/tesseract.exe" # 獲取圖片中像素點數量最多的像素 def get_threshold(image): pixel_dict = defaultdict(int) # 像素及該像素出現次數的字典 rows, cols = image.size for i in range(rows): for j in range(cols): pixel = image.getpixel((i, j)) pixel_dict[pixel] += 1 count_max = max(pixel_dict.values()) # 獲取像素出現出多的次數 pixel_dict_reverse = {v:k for k,v in pixel_dict.items()} threshold = pixel_dict_reverse[count_max] # 獲取出現次數最多的像素點 return threshold # 按照閾值進行二值化處理 # threshold: 像素閾值 def get_bin_table(threshold): # 獲取灰度轉二值的映射table table = [] for i in range(256): rate = 0.1 # 在threshold的適當范圍內進行處理 if threshold*(1-rate)<= i <= threshold*(1+rate): table.append(1) else: table.append(0) return table # 去掉二值化處理后的圖片中的噪聲點 def cut_noise(image): rows, cols = image.size # 圖片的寬度和高度 change_pos = [] # 記錄噪聲點位置 # 遍歷圖片中的每個點,除掉邊緣 for i in range(1, rows-1): for j in range(1, cols-1): # pixel_set用來記錄該店附近的黑色像素的數量 pixel_set = [] # 取該點的鄰域為以該點為中心的九宮格 for m in range(i-1, i+2): for n in range(j-1, j+2): if image.getpixel((m, n)) != 1: # 1為白色,0位黑色 pixel_set.append(image.getpixel((m, n))) # 如果該位置的九宮內的黑色數量小于等于4,則判斷為噪聲 if len(pixel_set) <= 4: change_pos.append((i,j)) # 對相應位置進行像素修改,將噪聲處的像素置為1(白色) for pos in change_pos: image.putpixel(pos, 1) return image # 返回修改后的圖片 # 識別圖片中的數字加字母 # 傳入參數為圖片路徑,返回結果為:識別結果 def OCR_lmj(img_path): image = Image.open(img_path) # 打開圖片文件 imgry = image.convert("L") # 轉化為灰度圖 # 獲取圖片中的出現次數最多的像素,即為該圖片的背景 max_pixel = get_threshold(imgry) # 將圖片進行二值化處理 table = get_bin_table(threshold=max_pixel) out = imgry.point(table, "1") # 去掉圖片中的噪聲(孤立點) out = cut_noise(out) #保存圖片 # out.save("E://figures/img_gray.jpg") # 僅識別圖片中的數字 #text = pytesseract.image_to_string(out, config="digits") # 識別圖片中的數字和字母 text = pytesseract.image_to_string(out) # 去掉識別結果中的特殊字符 exclude_char_list = " .:|""?![],()~@#$%^&*_+-={};<>/¥" text = "".join([x for x in text if x not in exclude_char_list]) #print(text) return text def main(): # 識別指定文件目錄下的圖片 # 圖片存放目錄figures dir = "E://figures" correct_count = 0 # 圖片總數 total_count = 0 # 識別正確的圖片數量 # 遍歷figures下的png,jpg文件 for file in os.listdir(dir): if file.endswith(".png") or file.endswith(".jpg"): # print(file) image_path = "%s/%s"%(dir,file) # 圖片路徑 answer = file.split(".")[0] # 圖片名稱,即圖片中的正確文字 recognizition = OCR_lmj(image_path) # 圖片識別的文字結果 print((answer, recognizition)) if recognizition == answer: # 如果識別結果正確,則total_count加1 correct_count += 1 total_count += 1 print("Total count: %d, correct: %d."%(total_count, correct_count)) """ # 單張圖片識別 image_path = "E://figures/code (1).jpg" OCR_lmj(image_path) """ main()
運行結果如下:
("101659", "101659") ("111073", "111073") ("114510", "114510") ("118235", "118235") ("124677", "124677") ("147291", "147291") ("169147", "169147") ("185302", "185302") ("23YB", "23YB") ("262051", "262051") ("2HED", "2MED") ("315386", "315386") ("3D7K", "3D7K") ("3DYH", "3DYH") ("3QG8", "30G8") ("3XNR", "EXNR") ("44G5", "44G5") ("470259", "470259") ("515413", "515413") ("522351", "522351") ("539824", "539824") ("5CVL", "SCVL") ("642689", "642689") ("671991", "671991") ("672838", "672838") ("6F5Y", "6F5Y") ("6USB", "GUSB") ("703167", "703167") ("765120", "765120") ("779931", "779931") ("8UEF", "8SUEF") ("905857", "905857") ("9H4H", "9H4H") ("9SK1", "OSK1") ("BDP4", "BDP4") ("DXV3", "DXV3") ("E78Y", "E78Y") ("EAHR", "EAHR") ("F585", "Fss§") ("FBV8", "FBV8") ("FJKK", "FJKK") ("GXKQ", "GXKQ") ("H7Y9", "H7Y9") ("J4LJ", "J4LJ") ("J8YH", "J8YH") ("JCDL", "JCDL") ("JTX2", "JTX2") ("JYLH", "JYLH") ("KFYA", "KFYA") ("L3VZ", "L3VZ") ("LCGV", "LCGV") ("LKEK", "LKEK") ("N3FJ", "N3FJ") ("PJZN", "PJZN") ("PNDQ", "PNDQ") ("Q7HP", "Q7HP") ("QSHU", "QSHU") ("R1RN", "RLRN") ("RPNX", "RPNX") ("TUKG", "TUKG") ("U9G3", "U9G3") ("UZAH", "UZAH") ("V6P9", "very") ("Y18D", "18D") ("Y237", "Y237") ("ZZT5", "2215") Total count: 66, correct: 54.
我們可以看到圖片識別的正確率為80%以上,其中數字類圖片的識別正確率為100%.
??我們可以在圖片識別方面的算法再加改進,以提高圖片識別的正確率。當然,以上算法并不是對所有驗證碼都適用,不同的驗證碼需要用不同的圖片處理算法。
注意:本人現已開通兩個微信公眾號: 因為Python(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41835.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:學習網絡爬蟲主要分個大的版塊抓取,分析,存儲另外,比較常用的爬蟲框架,這里最后也詳細介紹一下。網絡爬蟲要做的,簡單來說,就是實現瀏覽器的功能。 Python學習網絡爬蟲主要分3個大的版塊:抓取,分析,存儲 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細介紹一下。 首先列舉一下本人總結的相關文章,這些覆蓋了入門網絡爬蟲需要的基本概念和技巧:寧哥的小站-網絡爬蟲,當我們在瀏覽器中輸入...
python作為一門比較常見的編程語言,在工作當中的應用還是比較的廣泛的,比如可以對此進行相關的自動化測試,比如自動化測試相關的代碼,另外還有破解滑動驗證碼。那么,具體的操作手法是怎樣的呢?下面就給大家詳細解答下。 在Web自動化測試的過程中,經常會被登錄的驗證碼給卡住,不知道如何去通過驗證碼的驗證。 一般的情況下遇到驗證碼我們可以都可以找開發去幫忙解決,關閉驗證碼,或者給一個萬能的驗證碼...
小編寫這篇文章的主要目的,主要是用來給大家介紹關于python自動化測試的一些事情,涉及到的內容主要有包括破解圖文驗證碼等相關的一些事宜,具體怎么才能夠破解圖文驗證碼呢?下面就給大家詳細解答下。 對于web應用程序來講,處于安全性考慮,在登錄的時候,都會設置驗證碼, 驗證碼的類型種類繁多,有圖片中辨別數字字母的,有點擊圖片中指定的文字的,也有算術計算結果的,再復雜一點就是滑動驗證的。 諸...
閱讀 2637·2023-04-26 02:17
閱讀 1610·2021-11-24 09:39
閱讀 1070·2021-11-18 13:13
閱讀 2598·2021-09-02 15:11
閱讀 2770·2019-08-30 15:48
閱讀 3406·2019-08-30 14:00
閱讀 2431·2019-08-29 13:43
閱讀 658·2019-08-29 13:07