mac使用python識別圖形驗證碼!

2021-01-15 Python學習交流
前言

首先這篇文章,主要是研究圖形驗證碼,後期會不定時拓展內容。

在網上查了很多版本的圖形驗證碼識別,目前看到最多的兩個模塊是pytesseract和tesserocr,但是因為我這裡安裝tesserocr的時候各種出錯,所以最終我鎖定了使用pytesseract。

那麼接下來,就記錄下安裝以及使用過程。這裡的系統環境是mac os 10.14.

安裝tesserocr

brew install tesserocr

因為pytesseract依賴於tesserocr所以首先需要先安裝tesserocr這個軟體。接下來就是安裝python相關的包

安裝python所需要的包

pip3 install pytesseract
pip3 install pillow

安裝pytesseract是ocr識別圖片上的字,因為驗證碼的識別難度高低不同,所以在這個過程中需要對圖片做一定的處理,這就需要使用處理圖片的模塊pillow。

一個簡單的demo

import pytesseract
from PIL import Image
import os


def binarizing(img, threshold):
"""傳入image對象進行灰度、二值處理"""
pixdata = img.load()
w, h = img.size
# 遍歷所有像素,大於閾值的為黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
return img


_temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg')
print("file_path", file_path)
image = Image.open(file_path)
image = image.convert('L')
threshold = 157
table = []
# 接下來是二值化處理
# 遍歷所有像素,大於閾值的為黑色,threshold是閥值
image = binarizing(image, threshold)
result = pytesseract.image_to_string(image)
print(result)

示例中的圖片

需要用到的圖像知識:

對於彩色圖像,不管其圖像格式是PNG,還是BMP,或者JPG,在PIL中,使用Image模塊的open()函數打開後,返回的圖像對象的模式都是「RGB」。而對於灰度圖像,不管其圖像格式是PNG,還是BMP,或者JPG,打開後,其模式為「L」也就是我們說的灰度化的一個操作。除此之外,還有其他的模式,不過我們在處理驗證碼的時候是將其轉為灰度模式,所以就不強調其他的模式了。

模式「L」

模式「L」為灰色圖像,它的每個像素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。在PIL中,從模式「RGB」轉換為「L」模式是按照下面的公式轉換的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

通過灰度化之後的圖片變為

灰度化我們還要對其進行二值化操作

二值化操作

二值化故名思議,就是整個圖像所有像素只有兩個值可以選擇,一個是黑(灰度為0),一個是白(灰度為255)。二值化的好處就是將圖片上的有用信息和無用信息區分開來,比如二值化之後的驗證碼圖片,驗證碼像素為黑色,背景和幹擾點為白色,這樣後面對驗證碼像素處理的時候就會很方便。對於簡單的圖形驗證碼,到這裡基本上就夠了,但是如果有幹擾線,還要進行除幹擾線的操作。

對應的代碼為

def binarizing(img, threshold):
"""傳入image對象進行灰度、二值處理"""
pixdata = img.load()
w, h = img.size
# 遍歷所有像素,大於閾值的為黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0 #小於閥值設為0,0是黑色
else:
pixdata[x, y] = 255 0 #大於閥值設為255,255是白色
return img

此時的圖片效果為

可以看到圖片變得銳化了很多,這個時候再去識別就比較好識別了。

去幹擾線

常見的4鄰域、8鄰域算法。所謂的X鄰域算法,可以參考手機九宮格輸入法,按鍵5為要判斷的像素點,4鄰域就是判斷上下左右,8鄰域就是判斷周圍8個像素點。如果這4或8個點中255的個數大於某個閾值則判斷這個點為噪音,閾值可以根據實際情況修改。

使用cv2處理

除此之外還可以使用cv2模塊進行處理。

安裝

pip install opencv-python

代碼示例

# -*- coding: utf-8 -*-
# @時間 : 2020-01-08 18:01
# @作者 : 陳祥安
# @文件名 : cv2_demo.py
# @公眾號: Python學習開發

import cv2
import numpy as np
import os

_temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg')


def remove_noise(img, k=4):
###8領域過濾
img2 = img.copy()

# img處理數據,k過濾條件
w, h = img2.shape

def get_neighbors(img3, r, c):
count = 0
for i in [r - 1, r, r + 1]:
for j in [c - 1, c, c + 1]:
if img3[i, j] > 10: # 純白色
count += 1
return count

# 兩層for循環判斷所有的點
for x in range(w):
for y in range(h):
if x == 0 or y == 0 or x == w - 1 or y == h - 1:
img2[x, y] = 255
else:
n = get_neighbors(img2, x, y) # 獲取鄰居數量,純白色的鄰居
if n > k:
img2[x, y] = 255
return img2


img = cv2.imread(file_path)

# 將圖片灰度化處理,降維,加權進行灰度化c
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t, gray2 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
cv2.imshow('threshold', gray2)
result = remove_noise(gray2)
cv2.imshow('8neighbors', result)

cv2.waitKey(0)

#cv2.destroyAllWindows()

加群:850591259   私信小編01 領取完整項目代碼!

相關焦點

  • Python驗證碼識別:利用pytesser識別簡單圖形驗證碼
    圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區分,面積計算,體積計算,扭曲變形校正。對於顏色則有色彩空間的計算與轉換,圖形上色,陰影,色差處理等等。在破解驗證碼中需要用到的知識一般是 像素,線,面等基本2維圖形元素的處理和色差分析。
  • 使用Python和Tesseract來識別圖形驗證碼
    *本文原創作者:ipenox,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載各位在企業中做Web漏洞掃描或者滲透測試的朋友,可能會經常遇到需要對圖形驗證碼進行程序識別的需求。很多時候驗證碼明明很簡單(對於非網際網路企業,或者企業內網中的應用來說特別如此),但因為沒有趁手的識別庫,也只能苦哈哈地進行人肉識別,或者無奈地放棄任務。在這裡,我分享一下自己使用Python和開源的tesseract OCR引擎做驗證碼識別的經驗,並提供相關的原始碼和示例供大家借鑑。
  • 用python識別驗證碼
    總之,tesseract-ocr是一個做圖形識別必須用到第一個軟體,不僅可以處理驗證碼,也可以識別圖片上的文字等等。我已經把軟體上傳了我的網盤,大家可以直接下載,不需要安裝,解壓即可。下載地址:連結:https://pan.baidu.com/s/1bpMz3OV 密碼:108a2、Pytesseract包Pytesseract是一個python的第三方的包,主要作用就是用來連接操作tesseract-ocr工具。為我們用python來處理圖形打好了基礎。可以使用pip工具直接安裝。
  • Python3網絡爬蟲課程 8.1圖形驗證碼的識別
    目前,很多網站都採取了各種各樣的反爬措施,其中之一便是使用驗證碼.隨著技術的發展,驗證碼卻來越複雜,花樣越來越多,爬蟲的工作也變得愈加複雜,本節將介紹圖形驗證碼的識別.圖形驗證碼我們首先將識別最簡單的驗證碼,圖形驗證碼.目標我們將以知網為例講解使用 OCR 技術識別圖形驗證碼.
  • 用Python識別圖形驗證碼,實現自動登陸!
    驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。雖說圖形驗證碼最簡單,但是對於我這等新手,還是要苦學一番。首先尋找測試網站,網站選的是如雲閣小說網,小網站不怕被封。他
  • 驗證碼識別實例,python簡單圖像處理和實現
    問題來源某系統門戶登陸界面如下:現在我們要實現自動的驗證碼識別。圖像特徵首先,我們仔細觀察下這個驗證碼圖像,可以發現一些固定特徵:1、驗證碼中的字符數始終為6,並且是灰度圖像。2、字符間的間隔看起來每次都一樣。3、 每個字符都是完全定義的。
  • 12306將剔除辨識率低圖形驗證碼
    「圖形驗證碼有利於普通人訂票」  朱建生介紹,後臺數據顯示,今年網站購票的平均排隊等待時間僅為1.8秒,系統運行穩定,運行效率大幅提升。同時,對於驗證碼的正確識別率,朱建生表示,正確填寫圖形驗證碼的機率在70%左右。
  • 圖形驗證碼難防黃牛 今年網購車票超8成無驗證碼
    中國鐵路總公司表示,今年春運網絡購票需要驗證碼的比例將被壓縮到15%以下。昨天,老牌搶票軟體360瀏覽器表示通過大數據分析,今年春運搶票初期,12306的圖形驗證碼並沒有比去年增加難度,他們發現圖形驗證碼已經不是鐵路防止黃牛倒票的主要技術手段,鐵路正在通過更加嚴格的實名認證等其他方式來防黃牛,提高了用戶的購票體驗。
  • 12306圖形驗證碼讓人"吐槽" 驗證碼到底有什麼用
    在年底的網絡購票高峰中,中國鐵路客戶服務中心的12306圖形驗證碼系統被很多購票者「吐槽」。人們不禁要問,複雜的驗證碼系統,到底有什麼用?其實,驗證碼存在的最大意義,就是區分在頁面上進行輸入操作的是人還是自動化的軟體。
  • 能跑源碼,還提供數據集:這裡有一個入門企業級驗證碼識別項目
    前言網上關於驗證麼識別的開源項目眾多,但大多是學術型文章或者僅僅是一個測試 demo,那麼企業級的驗證碼識別究竟是怎樣的呢?前方高能預警,這是一個生產水準的驗證碼識別項目,筆者可以向你們保證,它一定會是各位所見過的文章中最實用的,你甚至可以不需要懂代碼寫代碼就能輕鬆使用它訓練一個 99 識別率的模型。這才是企業級應該有的樣子:算法開發負責框架,訓練只需要一個實習生。
  • 要選對12306購票圖形驗證碼 比高考還難
    吐槽驗證碼成購票「攔路虎」「買張車票,眼睛都看成對眼了,我容易嗎我?」「人類何苦為難人類」……昨日,記者登錄各大鐵路論壇、微博看到了各種對於圖形驗證碼的吐槽。網友們紛紛表示,五花八門的圖形讓人看得眼花繚亂,有點像遊戲「找你妹」和「連連看」,大大降低了自己的購票速度和成功率。還有網友感慨:「搶過票,才知道自己見識少」。其中網友「注釋回憶」說,「整個過程就是:登錄12306->選票->輸驗證碼->錯誤->輸驗證碼->錯誤->輸驗證碼->正確->票沒了。」
  • 12306網站驗證碼遭拍磚 「驗證碼」本意是安全不是麻煩
    動態視頻驗證碼技術上具有先進性,但網站投入成本較高,目前還未普及。  為什麼一定要用圖形驗證碼?  「黃牛不可能人工去買票,必然是使用搶票軟體。」牛凱說,黃牛可能手中囤積大量的身份證號碼,刷票軟體可以自動登錄,用真實的身份證信息進行自動下單交易,由於整個過程由軟體自動完成,執行速度比正常用戶的手工操作快幾十倍乃至上百倍,因此可以搶得先機,大量刷票。
  • Python3爬蟲-10:Tesseract 圖像識別
    「人生苦短,快用Python」在爬蟲過程中,經常會遇到各種驗證碼
  • 「技術文章」《Python 資料庫 GUI CGI編程》
    使用的時候,必須安裝MySQLdb 模塊,否則會報出來模塊找不到。2.1 Linux下安裝MySQLdb模塊 使用包安裝可以 wget http://sourceforge.net/projects/mysql-python/files/latest/download$ tar xfz MySQL-python-1.2.3.tar.gz$ cd MySQL-python-1.2.3$whereis mysql_config
  • 網購火車票超八成無需驗證碼 只隨機出現
    中國鐵路總公司表示,今年春運網絡購票需要驗證碼的比例將被壓縮到15%以下。昨天,老牌搶票軟體360瀏覽器表示通過大數據分析,今年春運搶票初期,12306的圖形驗證碼並沒有比去年增加難度,他們發現圖形驗證碼已經不是鐵路防止黃牛倒票的主要技術手段,鐵路正在通過更加嚴格的實名認證等其他方式來防黃牛,提高了用戶的購票體驗。
  • 使用python3+opencv3實現的識別答題卡的例子(01)
    由於工作需要,最近在研究關於如何通過程序識別答題卡的客觀題的答案,之前雖然接觸過python,但對於計算機視覺這一塊卻完全是一個陌生的領域,經過各種調研
  • 最全的 Python 反爬蟲及應對方案!
    可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式.圖片驗證碼複雜型打碼平臺僱傭了人力,專門幫人識別驗證碼。識別完把結果傳回去。總共的過程用不了幾秒時間。這樣的打碼平臺還有記憶功能。圖片被識別為「鍋鏟」之後,那麼下次這張圖片再出現的時候,系統就直接判斷它是「鍋鏟」。
  • 網購火車票驗證碼被指難辨認 圖形碼已達581種
    昨天,360瀏覽器宣布他們攻破了12306的圖形驗證碼,並首次公布了一組12306驗證碼大數據。數據顯示,圖形碼的數量已經多達581種,按照要輸入兩個關鍵詞的登錄規則,用戶將有機會嘗試336980道不同驗證碼題目的機會,而一次性輸入正確的僅為8%。
  • Python3網絡爬蟲課程 8.2極驗滑動驗證碼的識別
    上一節了解了簡單驗證碼的識別,但是現在這種驗證碼非常少見,現在出現了一大批新型的驗證碼,如極驗滑動驗證碼,它需要拖動合併滑塊才能完成識別。目標本節目標是識別極驗滑動驗證碼,如分析思路、識別缺口、生成拖動路徑、模擬合併等。
  • 12306網購火車票驗證碼全靠猜 圖形碼已達581種
    近日,隨著2016年春運高峰搶票大戰臨近,不少用戶發現,圖形驗證碼的種類不僅增加了,圖片的清晰度也不高,識別起來比較困難。有些關鍵詞還從一個變成了兩個。北青報記者登錄12306時,就碰到了系統需要識別「排風機和掛鍾」的圖片,由於系統所給的8張圖片有些模糊,記者分辨了半天才進行選擇,沒想到,系統提示錯誤,原來記者將電扇誤認作了排風機,只好刷新後再來。