1. 程式人生 > >Python影象處理之圖片驗證碼識別

Python影象處理之圖片驗證碼識別

  在上一篇部落格Python影象處理之圖片文字識別(OCR)中我們介紹了在Python中如何利用Tesseract軟體來識別圖片中的英文與中文,本文將具體介紹如何在Python中利用Tesseract軟體來識別驗證碼(數字加字母)。
  我們在網上瀏覽網頁或註冊賬號時,會經常遇到驗證碼(CAPTCHA),如下圖:




本文將具體介紹如何利用Python的影象處理模組pillow和OCR模組pytesseract來識別上述驗證碼(數字加字母)。
  我們識別上述驗證碼的演算法過程如下:
  1. 將原影象進行灰度處理,轉化為灰度影象;
  2. 獲取圖片中畫素點數量最多的畫素(此為圖片背景),將該畫素作為閾值進行二值化處理,將灰度影象轉化為黑白影象(用來提高識別的準確率);
  3. 去掉黑白影象中的噪聲,噪聲定義為:以該點為中心的九宮格的黑點的數量小於等於4;
  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 = ' .:\\|\'\"?![],()[email protected]#$%^&*_+-={};<>/¥' 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), 歡迎大家關注哦~~

相關推薦

Python影象處理圖片驗證識別

  在上一篇部落格Python影象處理之圖片文字識別(OCR)中我們介紹了在Python中如何利用Tesseract軟體來識別圖片中的英文與中文,本文將具體介紹如何在Python中利用Tesseract軟體來識別驗證碼(數字加字母)。   我們在網上瀏覽網頁或

Python影象處理圖片文字識別(OCR)

OCR與Tesseract介紹   將圖片翻譯成文字一般被稱為光學文字識別(Optical Character Recognition,OCR)。可以實現OCR 的底層庫並不多,目前很多庫都是使用共同的幾個底層OCR 庫,或者是在上面進行定製。   Tess

轉載-Python影象處理圖片文字識別(OCR)

點選開啟連結   segmentFault_jclian91_Python影象處理之圖片文字識別(OCR)OCR與Tesseract介紹  將圖片翻譯成文字一般被稱為光學文字識別(Optical Character Recognition,OCR)。可以實現OCR 的底層庫並

Tensorflow例項2:將影象和標籤資料(*.csv)轉化成tfrecords檔案,以便後續直接讀取tfrecords檔案進行圖片驗證識別訓練

由於多張影象和標籤值不在一起,現在此方法是把captcha_dir = "../data/GenPics/"此路徑下的圖片與此路徑下的.csv檔案合併起來,通過writer = tf.python_io.TFRecordWriter(path="./data/captcha.tfreco

python爬蟲實現登陸簡單圖片驗證識別(Tesseract識別

Tesseract下載與安裝 附:德國曼海姆大學發行的3.05版本下載 安裝與配置PATH環境變數 安裝略,環境變數只要將目錄新增到PATH路徑,PATH路徑針對於命令列解析。 tesseract 1.png output-l eng -psm 7 -ps

字元型圖片驗證識別完整過程及Python實現

1111000111111000111111100001111100000011 1110111011110111011111011110111100110111 1001110011110111101011011010101101110111 110111111111011010111111010

python使用tesseract-ocr完成驗證識別

一、 tesseract-ocr    C++編寫,最開始由hp編寫,後來束之高閣,最後決定貢獻給google開源。      原始碼:https://github.com/tesseract-ocr/tesseract &nb

python+pillow+pytesseract+Tesseract-OCR驗證識別[轉]

安裝 pillow,pytesseract ,安裝該模組之後,還需要安裝 tesseract-ocr 。 (PS:如果安裝了pip,可以python的scripts檔案下,輸入cmd,然後輸入pip install pillow安裝最新版的pillow,如果需要安裝其它版本的則要自己下載

應用PHP GD庫中影象處理函式製作驗證

<?php //開啟session,之後會把驗證碼存入session,然後在後端與使用者輸入的驗證碼對比 session_start(); //新建一個真彩色影象 $image=imagecreatetruecolor(100, 30); //定義白色

圖片驗證識別教程技術原理分析

       面對技術這片大海,我們都是一個漁民,三天打魚,兩天結網。我是把過去自己所掌握的所有技術總結成一張網,若一個技術乾貨分享的東西離我的網還太遠,我就會放棄去了解。因為如果不能連結到這張網中,

Python影象處理Pillow--ImageFilter

ImageFilter:Python中的影象濾波,主要對影象進行平滑、銳化、邊界增強等濾波處理。 影象濾波:在儘量保留影象細節特徵的條件下對目標影象的噪聲進行抑制,是影象預處理中不可缺少的操作,其處理效果的好壞將直接影響到後續影象處理和分析的有效性和可靠性。 存在目的:由於

數字影象處理二維影象提取演算法(二)

二維碼標準: 國外:pdf417,Datamatrix,QR 國內:龍貝,漢信。 影象輸入-> 影象預處理-> 二維碼影象切割(定位)-> 二維碼影象校正-> 譯碼 譯碼:二維碼碼字提取-> 糾錯譯碼-> 資訊譯碼 糾錯譯碼:求解伴隨因

python影象處理scikit-image基本用法

本文介紹Python語言用於數字影象處理,那麼要使用python進行各種開發和科學計算,需要對應相對的python包, python有很多的數字影象處理相關的包,像 PIL Pillow OpenCV scikit-image 等等 其中PIL和Pil

Tesseract做圖片驗證識別

linux下的安裝 [ 參考這裡 ] 環境準備 yum -y update yum -y install libstdc++ autoconf automake libtool autoconf-archive pkg-config gcc gc

Python影象處理邊緣檢測

在影象識別中,需要有邊緣鮮明的影象,即影象銳化。影象銳化的目的是為了突出影象的邊緣資訊,加強影象的輪廓特徵,以便於人眼的觀察和機器識別。 在空間域進行影象銳化主要有以下幾種方法: 1、梯度運算元 影象的邊緣最直觀的表現就是邊緣兩側的灰度值相差比較大,在微積

JMeter開發插件——圖片驗證識別

text vat 工作 ror let 繼承 eol 遭遇 arr 我們在性能測試中總會時不時地遭遇到來自於應用系統的各種阻礙,圖片驗證碼就是一類最常見的束縛,登錄或交易時需要按照圖片中的內容輸入正確的驗證信息後,數據才可以提交成功,這使得許多性能測試工具只能望而卻步。網上

網站安全檢測圖片驗證

在對網站安全進行整體的安全檢測的時候,使用者登陸以及使用者留言,評論,設定支付密碼,以及一些網站功能方面都會用到圖片驗證碼,針對於

Win7下安裝Python影象處理庫PIL、pytesser、tesseract進行驗證識別

前言 今天看見一個關於Python進行驗證碼識別的文章,其中程式碼很短,但是感覺很有趣,加上最近也在學習一些簡單的Python知識,所以決定實驗一下 準備工作 PIL版本選擇 從網上搜索得知,PIL官方只有32位的安裝檔案,安裝時會提示找不到py

驗證識別圖片處理(一些細節處理

上一篇我們聊到了圖片驗證碼處理的基本流程,已經可以應付絕大多數圖片驗證碼了。 驗證碼識別之圖片處理(基礎流程)------ 連結戳這裡 我們來看一下成果: 可以看到應付我們的學習演算法需求已經足夠。 今天我們來看看一些特殊圖片的處理方法: 1、帶邊框驗證碼:

python驗證識別 特征向量提取和余弦相似性比較

wow gif .get extra time ade upd orm log 0.目錄 1.參考2.沒事畫個流程圖3.完整代碼4.改進方向 1.參考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wi