當前位置:編程學習大全網 - 人物素材 - pixel圖片素材-如何利用Python做簡單的驗證碼識別

pixel圖片素材-如何利用Python做簡單的驗證碼識別

pixelstudio導入照片大小

1.

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

2.

然後就可以從素材庫中直接添加圖片,同時點擊下方的從設備還可以導入手機中的圖片。

3.

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

4.

如圖,導入圖片素材後可以對其進行大小和位置的調整

如何保存pixel壁紙內的圖片

用PixelStylePhotoEditor,您可以將圖像文檔保存為TIFF/JPEG/PNG/GIF/BMP/PSDB/JPEG2000/PDF/SVG格式。

第壹步:選擇菜單欄中的“文件”—>“存儲”。

第二步:彈出“存儲”對話框中,鍵入圖像的名稱。

第三步:選擇要保存的文件格式。

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

提示:

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

第四步:單擊“保存”按鈕保存對文檔的更改。

如何利用Python做簡單的驗證碼識別

1__

驗證碼是目前互聯網上非常常見也是非常重要的壹個事物,充當著很多系統的_闌鵯_功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了壹套字符驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有壹定的借鑒意義。

然後經過了壹年的時間,筆者又研究和get到了壹種更強大的基於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__夭難≡

由於本文是以初級的學習研究目的為主,要求_壩寫硇,但又不會太難”,所以就直接在網上找個比較有代表性的簡單的字符型驗證碼(感覺像在找漏洞壹樣)。

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

原始圖:

放大清晰圖:

此圖片能滿足要求,仔細觀察其具有如下特點。

有利識別的特點:

由純阿拉伯數字組成

字數為4位

字符排列有規律

字體是用的統壹字體

以上就是本文所說的此驗證碼簡單的重要原因,後續代碼實現中會用到

不利識別的特點:

圖片背景有幹擾噪點

這雖然是不利特點,但是這個幹擾門檻太低,只需要簡單的方法就可以除去

7.2__夭幕袢

由於在做訓練的時候,需要大量的素材,所以不可能用手工的方式壹張張在瀏覽器中保存,故建議寫個自動化下載的程序。

主要步驟如下:

通過瀏覽器的抓包功能獲取隨機圖片驗證碼生成接口

批量請求接口以獲取圖片

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

這些都是壹些IT基本技能,本文就不再詳細展開了。

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

defdownloads_pic(**kwargs):

pic_name=('pic_name',None)

url='httand_code_captcha/'

res=(url,stream=True)

withopen(pic_path+pic_name+'.bmp','wb')asf:__forchunkin_content(chunk_size=1024):___ifchunk:#filteroutkeep-alivenewchunks____f.write(chunk)

f.flush()

f.close()

循環執行N次,即可保存N張驗證素材了。

下面是收集的幾十張素材庫保存到本地文件的效果圖:

8__計ご_

雖然目前的機器學習算法已經相當先進了,但是為了減少後面訓練時的復雜度,同時增加識別率,很有必要對圖片進行預處理,使其對機器識別更友好。

針對以上原始素材的處理步驟如下:

讀取原始圖片素材

將彩色圖片二值化為黑白圖片

去除背景噪點

8.1__禱計

主要步驟如下:

將RGB彩圖轉為灰度圖

將灰度圖按照設定閾值轉化為二值圖

image=(img_path)

imgry=('L')#轉化為灰度圖table=get_bin_table()

out=(table,'1')

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

1234567891011121314

def_et_bin_table(threshold=140):__"""__獲取灰度轉二值的映射table__:paramthreshold:__:return:__"""__table=_]__for__n_ange(256):____if_<threshold:______(0)____else:______(1)___eturn_able

由PIL轉化後變成二值圖片:0表示黑色,1表示白色。二值化後帶噪點的6937_南袼氐閌涑齪筧縵巒:

1111000111111000111111100001111100000011

1110111011110111011111011110111100110111

1001110011110111101011011010101101110111

1101111111110110101111110101111111101111

1101000111110111001111110011111111101111

1100111011111000001111111001011111011111

1101110001111111101011010110111111011111

1101111011111111101111011110111111011111

1101111011110111001111011110111111011100

1110000111111000011101100001110111011111

如果妳是近視眼,然後離屏幕遠壹點,可以隱約看到6937_墓羌芰恕

8.2__コ氳

在轉化為二值圖片後,就需要清除噪點。本文選擇的素材比較簡單,大部分噪點也是最簡單的那種_鋁⒌,所以可以通過檢測這些孤立點就能移除大量的噪點。

關於如何去除更復雜的噪點甚至幹擾線和色塊,有比較成熟的算法:_樗畛浞_loodFill,後面有興趣的時間可以繼續研究壹下。

本文為了問題簡單化,幹脆就用壹種簡單的自己想的_虻グ旆_來解決掉這個問題:

對某個_詰_周邊的九宮格裏面的黑色點計數

如果黑色點少於2個則證明此點為孤立點,然後得到所有的孤立點

對所有孤立點壹次批量移除。

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

將所有的像素點如下圖分成三大類

頂點A

非頂點的邊界點B

內部點C

種類點示意圖如下:

其中:

A類點計算周邊相鄰的3個點(如上圖紅框所示)

B類點計算周邊相鄰的5個點(如上圖紅框所示)

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

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

A類點繼續細分為:左上,左下,右上,右下

B類點繼續細分為:上,下,左,右

C類點不用細分

然後這些細分點將成為後續坐標獲取的準則。

主要算法的python實現如下:

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

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

:paramx:

:paramy:

:return:_"""

#todo判斷圖片的長寬度下限

cur_pixel=((x,y))#當前像素點的值

width=

height=_ifcur_pixel==1:#如果當前點為白色區域,則不統計鄰域值

return0_ify==0:#第壹行

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

#中心點旁邊3個點

sum=cur_pixel\____+((x,y+1))\____+((x+1,y))\____+((x+1,y+1))___return4-sum__elifx==width-1:#右上頂點

sum=cur_pixel\____+((x,y+1))\____+((x-1,y))\____+((x-1,y+1))___return4-sum__else:#最上非頂點,6鄰域

sum=((x-1,y))\____+((x-1,y+1))\____+cur_pixel\____+((x,y+1))\____+((x+1,y))\____+((x+1,y+1))___return6-sum_elify==height-1:#最下面壹行

ifx==0:#左下頂點

#中心點旁邊3個點

sum=cur_pixel\____+((x+1,y))\____+((x+1,y-1))\____+((x,y-1))___return4-sum__elifx==width-1:#右下頂點

sum=cur_pixel\____+((x,y-1))\____+((x-1,y))\____+((x-1,y-1))___return4-sum__else:#最下非頂點,6鄰域

sum=cur_pixel\____+((x-1,y))\____+((x+1,y))\____+((x,y-1))\____+((x-1,y-1))\____+((x+1,y-1))___return6-sum_else:#y不在邊界

ifx==0:#左邊非頂點

sum=((x,y-1))\____+cur_pixel\____+((x,y+1))\____+((x+1,y-1))\____+((x+1,y))\____+((x+1,y+1))___return6-sum__elifx==width-1:#右邊非頂點

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

sum=((x,y-1))\____+cur_pixel\____+((x,y+1))\____+((x-1,y-1))\____+((x-1,y))\____+((x-1,y+1))___return6-sum__else:#具備9領域條件的

sum=((x-1,y-1))\____+((x-1,y))\____+((x-1,y+1))\____+((x,y-1))\____+cur_pixel\____+((x,y+1))\____+((x+1,y-1))\____+((x+1,y))\____+((x+1,y+1))___return9-sum

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

計算好每個像素點的周邊像素黑點(註意:PIL轉化的圖片黑點的值為0)個數後,只需要篩選出個數為1或者2_牡愕淖曇次_孤立點_U飧讎卸戲椒?贍懿惶既,但是基本上能夠滿足本文的需求了。

經過預處理後的圖片如下所示:

對比文章開頭的原始圖片,那些_鋁⒌_都被移除掉,相對比較_刪_的驗證碼圖片已經生成。

9__計址懈

由於字符型_櫓ぢ臚計_本質就可以看著是由壹系列的_ジ鱟址計_拼接而成,為了簡化研究對象,我們也可以將這些圖片分解到_蛹_,即:_話ジ鱟址耐計

於是,我們的研究對象由__種字串的組合對象”_涑_“10種阿拉伯數字”_拇_,極大的簡化和減少了處理對象。

9.1__指釧惴

現實生活中的字符驗證碼的產生千奇百怪,有各種扭曲和變形。關於字符分割的算法,也沒有很通用的方式。這個算法也是需要開發人員仔細研究所要識別的字符圖片的特點來制定的。

當然,本文所選的研究對象盡量簡化了這個步驟的難度,下文將慢慢進行介紹。

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

可以得到如下參數:

整個圖片尺寸是40*10

單個字符尺寸是6*10

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

字符上下緊挨邊緣(即相距0個像素)

這樣就可以很容易就定位到每個字符在整個圖片中占據的像素區域,然後就可以進行分割了,具體代碼如下:

defget_crop_imgs(img):_"""

按照圖片的特點,進行切割,這個要根據具體的驗證碼來進行工作.#見原理圖

:paramimg:

:return:_"""

child_img_list=[]_foriinrange(4):

x=2+i*(6+4)#見原理圖

y=0

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

child_img_(child_img)_returnchild_img_list

然後就能得到被切割的_蛹_的圖片元素了:

9.2__諶菪〗

基於本部分的內容的討論,相信大家已經了解到了,如果驗證碼的幹擾(扭曲,噪點,幹擾色塊,幹擾線)做得不夠強的話,可以得到如下兩個結論:

4位字符和40000位字符的驗證碼區別不大

純字母

不區分大小寫。分類數為26

區分大小寫。分類數為52

純數字。分類數為10

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

純數字__數字及字母組合_難櫓ぢ肭鴆淮

在沒有形成_甘痘蛘嘸負渭_的難度增加,而只是_噝雜邢藜_增加計算量時,意義不太大。

10__嘰綣橐

本文所選擇的研究對象本身尺寸就是統壹狀態:6*10的規格,所以此部分不需要額外處理。但是壹些進行了扭曲和縮放的驗證碼,則此部分也會是壹個圖像處理的難點。

11__P脫盜凡街

在前面的環節,已經完成了對單個圖片的處理和分割了。後面就開始進行_侗鵡P_的訓練了。

整個訓練過程如下:

大量完成預處理並切割到原子級的圖片素材準備

對素材圖片進行人為分類,即:打標簽

定義單張圖片的識別特征

使用SVM訓練模型對打了標簽的特征文件進行訓練,得到模型文件

12__夭淖急

本文在訓練階段重新下載了同壹模式的4數字的驗證圖片總計:3000張。然後對這3000張圖片進行處理和切割,得到12000張原子級圖片。

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

13__夭謀曇

由於本文使用的這種識別方法中,機器在最開始是不具備任何數字的觀念的。所以需要人為的對素材進行標識,告訴_魘裁囪耐計哪諶菔1。

這個過程叫做_氨曇恰薄

具體打標簽的方法是:

為0~9每個數字建立壹個目錄,目錄名稱為相應數字(相當於標簽)

人為判定_計諶,並將圖片拖到指定數字目錄中

每個目錄中存放100張左右的素材

壹般情況下,標記的素材越多,那麽訓練出的模型的分辨能力和預測能力越強。例如本文中,標記素材為十多張的時候,對新的測試圖片識別率基本為零,但是到達100張時,則可以達到近乎100%的識別率

14__卣餮≡

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

從宏觀上看,不同的數字圖片的本質就是將黑色按照壹定規則填充在相應的像素點上,所以這些特征都是最後圍繞像素點進行。

字符圖片_6個像素,高10個像素,理論上可以最簡單粗暴地可以定義出60個特征:60個像素點上面的像素值。但是顯然這樣高維度必然會造成過大的計算量,可以適當的降維。

通過查閱相應的文獻_2],給出另外壹種簡單粗暴的特征定義:

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

每列上黑色像素的個數,可以得到6個特征

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

defget_feature(img):_"""

獲取指定圖片的特征值,

1.按照每排的像素點,高度為10,則有10個維度,然後為6列,總***16個維度

:paramimg_path:

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

width,height=

pixel_cnt_list=[]

height=10_foryinrange(height):

pix_cnt_x=0__forxinrange(width):___if((x,y))==0:#黑色點

pix_cnt_x+=1

pixel_cnt_(pix_cnt_x)_forxinrange(width):

pix_cnt_y=0__foryinrange(height):___if((x,y))==0:#黑色點

pix_cnt_y+=1

pixel_cnt_(pix_cnt_y)_returnpixel_cnt_list

然後就將圖片素材特征化,按照_ibSVM_付ǖ母袷繳梢蛔櫬卣髦島捅曇侵檔南蛄課

  • 上一篇:壹家簡單的壽司店有壹個很有創意的名字。
  • 下一篇:英語日常用語 詞匯 的書
  • copyright 2024編程學習大全網