ǰλã̌WȫW - ز - 像素素材——如何用Python做簡單的驗證碼識別|ՄՓIJ

像素素材——如何用Python做簡單的驗證碼識別|ՄՓIJ

Pixelstudio導入1的照片尺寸。

首先我們打開軟件,點擊下方工具欄中的添加圖片功能。

2.

然後可以直接從素材庫添加圖片,點擊下面的從設備從手機導入圖片。

3.

點擊從設備後,可以導入手機中存儲的像素圖,也可以直接導入相冊中的照片,但大小要控制在256*256像素以內。

4.

如圖所示,可以調整導入圖片素材的大小和位置。

如何在像素壁紙中保存圖片用PixelStylePhotoEditor,可以將圖片文檔保存為TIFF/JPEG/PNG/GIF/BMP/PSDB/JPEG 2000/PDF/SVG格式。

第壹步:在菜單欄中選擇“文件”->;“存儲”

步驟2:在“保存”對話框中,鍵入圖像的名稱。

步驟3:選擇要保存的文件格式。

可導出的文件格式和相應的選項。

提示:

1.如果您尚未完成編輯,並希望下次打開該文件,請將文檔保存為PixelStyle圖像(PSDB)。

步驟4:單擊保存按鈕保存對文檔的更改。

如何用Python識別1__作為簡單的驗證碼?

驗證碼是目前互聯網上很常見也很重要的東西,充當著很多系統的功能。然而,隨著OCR技術的發展,驗證碼暴露出的安全問題越來越嚴重。本文介紹了壹個完整的字符驗證碼識別過程,對驗證碼安全和OCR識別技術有壹定的借鑒意義。

然後經過壹年的時間,作者研究得到了壹種更強大的基於CNN卷積神經網絡的直接端到端驗證識別技術(文章不是我的,後來我整理了源代碼,簡介和源代碼都在這裏):

基於python語言的tensorflow端到端字符驗證碼識別源代碼整理(github源代碼共享)

2__直徑

關鍵詞:安全,字符圖片,驗證碼識別,OCR,Python,SVM,PIL

3__ _ _

本研究中使用的材料來自壹個舊的Web框架網站的公共圖像資源_呫呫呫 _.

本文只抓取了本網站的公開圖片資源,並_ ⑽從教_做了任何不必要的操作。

本文在撰寫相關報道時泄露了網站的身份信息。

本文作者_雅_網站相關人員紛紛針對本系統的漏洞,主動轉移到新系統中。

本報告主要目的僅供_CR交流學習_鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、鴕鳥、

4__

驗證碼非技術部分的介紹,可以參考之前寫的壹篇科普文章:

互聯網安全防火墻(1)-網絡驗證碼科普

說明了類型、使用場景、功能、主要識別技術等。的驗證碼,但不涉及任何技術內容。本章內容作為其國際掛鉤給出相應的識別解決方案,讓讀者對驗證碼的功能和安全性有更深入的了解。

5_荊·

要達到本文的目的,只需要簡單的編程知識,因為現在機器學習領域正在蓬勃發展,有很多打包的機器學習開源解決方案。普通程序員不需要了解復雜的數學原理,也就是可以實現這些工具的應用。

主要開發環境:

python3.5

PythonSDK版本

PIL

圖片處理庫

libsvm

開源svm機器學習庫

環境的安裝不是本文的重點,所以省略了。

6__九中

壹般來說,字符驗證碼的識別過程如下:

準備原始圖片材料

圖像預處理

圖像字符切割

圖片尺寸標準化

圖像字符標記

字符圖像特征提取

生成對應於特征和標記的訓練數據集。

訓練特征標記數據以生成識別模型

使用識別模型預測新的未知圖片集

達到根據“圖”返回正確字符集的目的

7__姚撓急了

7.1__姚楠

因為這篇論文主要是出於初級學習研究的目的,需要_ Ba來寫,但是不會太難,“所以我直接在網上找了壹個比較有代表性的,比較簡單的人物驗證碼(感覺就是找漏洞)。

最後在壹個老網站上找到了這張驗證碼圖片(估計是幾十年前的網站框架)。

原始圖紙:

放大清晰圖片:

這張圖可以滿足要求,仔細觀察有以下特點。

有利識別的特征:

由純阿拉伯數字組成

字數為4。

這些字符是有規律地排列的

字體是統壹字體。

以上就是這個驗證碼簡單的重要原因,後續的代碼實現中會用到。

不利識別的特征:

畫面背景有幹擾噪聲。

雖然這是壹個不利的特征,但是幹擾閾值太低,並且可以通過簡單的方法去除。

7.2__死亡帷幕循環

因為做培訓的時候需要大量的資料,不可能手工保存在瀏覽器裏,所以建議寫壹個自動下載的程序。

主要步驟如下:

通過瀏覽器的抓包功能獲得隨機圖片驗證碼生成界面。

批量請求界面獲取圖片。

將圖片保存到本地磁盤目錄。

以上都是壹些基本的IT技能,本文就不詳細展開了。

網絡請求和文件保存的代碼如下:

defdownloads_pic(**kwargs):

圖片名稱=('圖片名稱',無)

URL = ' http and _ code _ captcha/'

res=(url,stream=True)

withopen(pic_path+pic_name+'。bmp ',' WB ')ASF:_ _ for chunkin _ content(chunk _ size = 1024):_ _ _ if chunk:# filteroutkeep-alivenewchunks _ _ _ _ f . write(chunk)

f .沖洗()

f.close()

循環n次,就可以保存n份驗證材料。

以下是幾十個收藏的素材庫保存到本地文件的效果圖:

8__計劃_

雖然目前的機器學習算法已經相當先進,但是為了降低後期訓練的復雜度,提高識別率,還是需要對圖片進行預處理,使其對機器識別更加友好。

上述原料的加工步驟如下:

閱讀原圖片資料

彩色圖像二值化為黑白圖像

去除背景噪音

8.1__祈禱儀

主要步驟如下:

將RGB彩色地圖轉換為灰度地圖

根據設定的閾值將灰度圖像轉換為二值圖像。

image=(圖像路徑)

Imgry=('L')#轉換為灰度圖像table=get_bin_table()

out=(表,' 1 ')

上面引用的二元函數的定義如下:

1234567891011121314

def _ et _ bin _ table(threshold = 140):_ _ " " _ _獲取灰度到二進制值的映射表_ _:param threshold:_ _:return:_ _ " " _ _ table = _]_ for _ _ n _安歌(20 .閾值:_ _ _ _ _ _ _(0)_ _ _ _ _ _ _否則:_ _ _ _ _ _ _(1)_返回

經過PIL轉換,它變成了壹個二進制圖像:0表示黑色,1表示白色。二值化後6937_華南嘈雜;

1111000111111000111111100001111100000011

111011101111011101111101165438+ 010111100110111

1001110011110111101011011010101 101110111

110111111111011010111111065438+ 001111111101111

1101000111110111001111110011165 438+01111101111

1100111011111000001111111001011 111011111

1101110001111111101011010110165 438+01111011111

1101111011111111101111011 110111111011111

1101111011110111001111011165438 +00111111011100

1110000111111000011101100001110111011111

如果妳近視,然後遠離屏幕,就能隱約看到6937_墓。

8.2 _ _ ココ

在它被轉換成二值圖像之後,需要去除噪聲。本文選取的材料比較簡單,大部分噪聲都是最簡單的壹種——鋁⒌,所以通過檢測這些孤立點可以去除很多噪聲。

關於如何去除比較復雜的噪點甚至幹擾線和色塊,有比較成熟的算法:_每榣潯毎_loodFill,而且以後有興趣可以繼續研究。

為了簡化問題,本文簡單地用壹個簡單的自思_ _ _ _來解決這個問題:

數壹數圍繞某個_ _的九個方塊中的黑點

如果黑點少於兩個,則證明這個點是孤立點,然後求出所有的孤立點。

壹次性移除所有孤立點。

下面將詳細介紹具體的算法原理。

如下圖所示,將所有像素分為三類。

頂點a

非頂點的邊界點b

內部點c

類別點的示意圖如下:

其中包括:

A類點計算三個相鄰點(如上圖紅框所示)。

B類點計算相鄰的五個點(如上圖紅框所示)。

C類點計算相鄰8個點(如上圖紅框所示)。

當然,由於計算區域內基準點的方向不同,A類點和B類點也會細分:

A類點又細分為:左上、左下、右上、右下。

B類點進壹步細分為:上、下、左、右。

c類點不需要細分

那麽這些細分點就會成為後續坐標獲取的標準。

Python實現的主要算法如下:

defsum_9_region(img,x,y):_ " " "

9鄰域框,以當前點為中心的田字框,黑點數量。

:paramx:

:參數:

:返回:_ " " "

#todo確定圖片長度和寬度的下限。

Cur_pixel=((x,y))#當前像素的值。

寬度=

Height=_ifcur_pixel==1:#如果當前點是白色區域,將不計算鄰域值。

Return0_ify==0:#第壹行

Ifx==0:#左上頂點,4鄰域

中心點旁邊的# 3點

Sum = cur _ pixel \ _ _+((x,y+1)) \ _ _+((x+1,y)) \ _ _+((x+1,y+)

Sum = cur _ pixel \ _ _+((x,y+1)) \ _ _+((x-1,y)) \ _ _+((x-1,y+)

Sum = ((x-1,y)) \ _ _+((x-1,y+1))\ _ _+cur _ pixel \ _ _+((x,y+)

Ifx==0:#左下頂點

中心點旁邊的# 3點

Sum = cur _ pixel \ _ _+((x+1,y)) \ _ _+((x+1,y-1)) \ _ _+((x,y-)

Sum = cur _ pixel \ _ _+((x,y-1)) \ _ _+((x-1,y)) \ _ _+((x-1,y-)

Sum = cur _ pixel \ _ _+((x-1,y)) \ _ _+((x+1,y)) \ _ _+((x,y-1))。

Ifx==0:#左非頂點

Sum = ((x,y-1))\ _ _ _ _ _ _+cur _ pixel \ _ _+((x,y+1)) \ _ _+((x+1,y-)

#print('%s,%s'%(x,y))

Sum = ((x,y-1))\ _ _ _ _ _ _+cur _ pixel \ _ _+((x,y+1)) \ _ _+((x-1,y-)

sum=((x-1,y-1))\ _ _ _ _ _ _ _+((x-1,y))\ _ _ _ _ _ _ _+((x,y-1))\ _ _ _ _ _ _ _+cur _ pixel \ _ _ _ _ _ _+((x,y+1))\ _ _ _ _ _ _ _+((x+1)

小貼士:這個地方相當考驗人的細心和耐心。這個地方的工作量還是蠻大的,花了半個晚上才完成。

計算出每個像素的外圍像素黑點數(註:PIL換算的圖片黑點值為0)後,只需要篩選出1或2_ outliers _U _ points的個數即可。不好意思,基本能滿足這篇論文的需求。

預處理後的圖像如下:

對比文章開頭的原圖,已經去掉了那些_ Al _ ⒌ _生成了對比_刪除_的驗證碼圖片。

9__地址計數

因為性格類型_ 🄙ぢ臨_可以看作是由壹系列_ジ拼接而成乮乮_,為了簡化研究對象,我們還可以把這些圖片分解成_蛹_,也就是_字和地址公差。

所以我們的研究對象是_ _種字符串“_ _”10種阿拉伯數字“_”的組合對象,大大簡化和減少了處理對象。

9.1__指的是的位置。

在現實生活中,字符驗證碼的生成是多種多樣的,有各種各樣的扭曲和變形。字符分割的算法沒有統壹的方法。這種算法還要求開發者仔細研究待識別字符圖像的特征。

當然,本文選取的研究對象盡可能簡化了這壹步的難度,下面會慢慢介紹。

用圖片編輯軟件(PhoneShop或其他)打開驗證碼圖片,放大到像素級,觀察壹些其他參數:

可以獲得以下參數:

全圖尺寸為40*10。

單個字符大小為6*10。

左右字符和左右邊緣相距2個像素。

字符緊挨著邊緣的上方和下方(即,相隔0個像素)

這樣就很容易定位出整個畫面中每個字符所占的像素區域,然後就可以進行分割了。具體代碼如下:

defget_crop_imgs(img):_ " " "

根據圖片的特點,切,這個要根據具體的驗證碼來工作。#參見示意圖。

:參數:

:返回:_ " " "

child _ img _ list =[]_ for iinrange(4):

X=2+i*(6+4)#見示意圖。

y=0

child_img=((x,y,x+6,y+10))

child _ img _(child _ img)_ return child _ img _ list

然後就可以得到cut _ pupa _ picture元素了:

9.2__東莨菪堿

基於這部分的討論,相信妳已經了解到,如果驗證碼的幹擾(失真、噪聲、幹擾色塊、幹擾線)不夠強,可以得到以下兩個結論:

4個字符的驗證碼和4萬個字符的驗證碼區別不大。

純字母

不區分大小寫。分類號是26。

區分大小寫。分類號是52。

純數字。分類號是10。

數字和區分大小寫的字母的組合。分類號是62。

純數字_ _數字和字母組合_難以理解。

在不增加“甘坡”形成難度,只增加計算量的情況下,沒有太大意義。

10__集貿

本文選取的研究對象的大小是統壹狀態的規格:6*10,所以這部分不需要額外處理。但對於壹些扭曲、縮放的驗證碼,這部分也會是圖像處理的難點。

11__P駝賊範潔

在前面的環節中,已經完成了單幅圖片的處理和分割。_董鸚鵡螺P_的訓練是後來才開始的。

整個訓練過程如下:

大量的預處理和切割到原子級的圖片素材準備。

對素材圖片進行人工分類,也就是貼標簽。

定義單幅圖片的識別特征。

利用SVM訓練模型對標註後的特征文件進行訓練,得到模型文件。

12__姚腦急

在訓練階段,本文重新下載了相同圖案的4位驗證圖片,共計3000張。然後對這3000張圖片進行處理和切割,得到12000張原子圖。

在這張12000的圖片中,刪除壹些會影響訓練和識別的強幹擾材料,剪切後的效果圖如下:

13__姚某譚

因為本文使用的這種識別方法,機器壹開始是沒有任何數字概念的。所以需要人工識別材質,告訴_ Yan哪個是1。

這個過程被稱為氨霾變薄。

具體的標註方法是:

為0到9的每個數字創建壹個目錄,目錄名就是對應的數字(相當於壹個標簽)。

人工判斷_計算,並將圖片拖動到指定的數字目錄。

每個目錄包含大約100條材料。

壹般來說,標註的材料越多,訓練好的模型的分辨率和預測能力就越強。比如本文,當標註材料超過十個時,新測試圖片的識別率基本為零,但達到100時,可以達到近100%。

14__ 卣廈

對於剪切的單字符圖片,像素級放大如下:

從宏觀的角度來看,不同數碼圖片的本質都是按照壹定的規則在對應的像素上填充黑色,所以這些特征最終都是圍繞像素進行的。

人物圖片_6像素,10像素高,理論上可以最簡單粗暴的定義60個特征:60像素點以上的像素值。但顯然,如此高的維度必然導致計算量過大,可以適當降低維度。

通過查閱相應的文獻[2],給出了另壹個簡單粗暴的特征定義:

每行黑色像素的數量可以得到10個特征。

根據每列黑色像素的數量,可以得到六個特征。

最後得到壹組16維的特征,實現代碼如下:

defget_feature(img):_ " " "

獲取指定圖像的特征值,

1.根據每行像素,如果高度為10,則有10個維度,然後有6列,總共***16個維度。

:paramimg_path:

:return:壹個維度為10(高度)的列表_ " " "

寬度,高度=

pixel_cnt_list=[]

height = 10 _ foryinrange(height):

pix _ CNT _ x = 0 _ _ forxirange(width):_ _ if((x,y)) = = 0: #黑點。

pix_cnt_x+=1

pixel _ CNT _(pix _ CNT _ x)_ forxinrange(寬度):

pix _ CNT _ y = 0 _ _ for yinrange(height):_ _ if((x,y)) = = 0: #黑點。

pix_cnt_y+=1

pixel _ CNT _(pix _ CNT _ y)_ return pixel _ CNT _ list

然後對圖片素材進行特征化,根據_ibSVM_付媽媽付小費,將文件入侵。

  • һƪ:WӲ߄
  • һƪ:
  • copyright 2024̌WȫW