導航:首頁 > 源碼編譯 > 驗證碼切割演算法

驗證碼切割演算法

發布時間:2022-10-30 01:39:17

『壹』 手機驗證碼的原理是什麼

驗證碼一般是防止有人利用機器人自動批量注冊、對特定的注冊用戶用特定程序暴力破解方式進行不斷的登陸、灌水。因為驗證碼是一個混合了數字或符號的圖片,人眼看起來都費勁,機器識別起來就更困難。像網路貼吧未登錄發貼要輸入驗證碼大概是防止大規模匿名回帖的發生。 一般注冊用戶ID的地方以及各大論壇都要要輸入驗證碼

『貳』 驗證碼識別之模板匹配方法

在寫爬蟲的時候難免會遇到驗證碼識別的問題,常見的驗證碼識別的流程為:

- 圖像灰度化

- 圖像去噪(如圖像二值化)

- 切割圖片

- 提取特徵

- 訓練

但這種方法要切割圖片,而且破解驗證碼的重點和難點就在於 能否成功分割字元 。

本文要介紹的演算法 不需要進行圖片切割,也不需要進行機器訓練 ,這種方法就是模板匹配:將待識別的文字切割成一個個模板,在待識別的圖像中去匹配模板。

這篇文章將分為兩個部分:

第一部分介紹模板匹配的基本概念以及模板匹配的一種實現演算法:快速歸一化互相關匹配演算法;

第二部分是一個具體實例。

模板匹配是在圖像中尋找目標的方法之一,目的就是在一幅圖像中尋找和模板圖像最相似的區域。

模板匹配的大致過程是這樣的:通過在輸入圖像上滑動圖像塊對實際的圖像塊和輸入圖像進行匹配。

假設我們有一張100x100的輸入圖像,有一張10x10的模板圖像,查找的過程是這樣的:

從輸入圖像的左上角(0,0)開始,切割一塊(0,0)至(10,10)的臨時圖像;

用某種方法得出臨時圖像與模板的相似度c,存放到相似度矩陣中(矩陣大小為91 x91);

切割輸入圖像從(0,1)至(10,11)的臨時圖像,對比,並記錄到相似度矩陣;

重復上述步驟,直到輸入圖像的右下角。

最終得到一個相似度矩陣,找到矩陣中的最大或最小值,最大值(最小值)對應的臨時圖像即為與模板最相似的圖像。

在步驟b中,求模板與圖像的相似度有多種方法,如平均絕對差演算法(MAD)、絕對誤差和演算法(SAD)、誤差平方和演算法(SSD)、歸一化互相關演算法(NCC),本文使用的是歸一化互相關演算法。

什麼是歸一化互相關?

從幾何圖形上來看,空間中的兩個向量,同方向平行時,歸一化互相關系數為1,表示兩個向量最相似,反方向平行時歸一化互相關系數為-1,垂直時為0,表示最不相似(用互相垂直的三個向量來代表整個空間也是這個道理,垂直的向量之間不包含對方的信息,相關系數為0),存在一定夾角時處於(-1,1),是不是跟餘弦函數很像,cos(0)=1,cos(pi/2)=0,cos(pi)=-1。就是這個樣子的,相關系數可以看作是兩個向量之間夾角的cosine函數。

在數學中是這么計算cosine函數的,假設兩個n維向量X,Y,對應的坐標分別為(x1,x2,…xn), (y1,y2,…yn) 則:

(如果想要了解更多,請參考文獻【2】)

但這是一維的,在模板匹配中要再加一個維度 (具體演算法請參考文獻【3】) ,簡要說一下文獻【3】的內容:如果直接計算二維相似度的話計算復雜度會非常高,文獻【3】利用快速傅里葉變換與積分圖像快速演算法來降低計算復雜度。

接下來讓我們看一個具體的應用。

模板匹配識別驗證碼的具體步驟為:

1. 找出圖片中所有可能出現的字元,製作成模板集合

2. 圖像灰度化

3. 圖片去噪(二值化)

4. 模板匹配

5. 匹配結果優化

要識別的圖片如下,以識別圖片中的加字為例:



要從image中找到與模板最匹配的部分,Template圖像是事先從image圖像中截取的一部分。所用的為python模塊skimage中的match_template方法,match_template方法使用的是快速歸一化互相關演算法 【2】 。

遍歷模板圖像集合,與圖像匹配,如果dist大於閾值h,則認為此模板在圖像中存在,否則不存在,繼續匹配下一個模板,直到遍歷完所有模板。

以模板『加』為例,圖像大小為40x260,模板大小27x27,result是一個大小為(14,234)的矩陣,即上文提到的相似度矩陣,矩陣中的數值屬於[-1,1],找到result中最大值所處的對應位置即為與模板最匹配的圖像位置:x=66,y=11,正好對應模板圖像在image中所處的位置。 (更多內容請參閱參考文獻【4】)

但這是比較好的情況,因為在匹配時遍歷了所有的模板,而一張圖片中出現的模板數量是有限的,比如數字』四』在圖片中是沒有的,這時就要根據某種規則去掉這些在圖片中沒有出現的模板:程序中使用dist變數來過濾匹配結果,如果dist變數大於某個值則認為此模板在圖像中不存在。

最後的result_list中可能仍然存在一些圖片中不存在的模板或者匹配不精確的模板,比如數字『一』在模板中不存在,但仍然可以匹配到,因為數字『二』中可以匹配到『一』,需要進一步優化,優化方法有很多,比如當匹配到的兩個模板距離過近時,選擇較大的那個模板,其餘方法留給讀者自行考慮吧。

後續將會推出如何使用深度學習識別驗證碼,敬請期待~


參考文獻:

http://www.cnblogs.com/beer/p/5672678.html

http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html

J. P. Lewis, 「Fast Normalized Cross-Correlation」, Instrial Light and Magic.

http://scikit-image.org/docsjinhqin/dev/auto_examples/plot_template.html


本文作者 :李暉(點融黑幫),畢業於電子科技大學,現就職於點融成都Data部門,對一切新鮮事物充滿好奇,對跳舞毫無抵抗力的活力女青年一枚。

『叄』 身份證號最後一位數字稱之為校驗碼,校驗碼的計算方式是怎樣的

按照相關規定,身份號是由17個數字和1個數字校驗碼組成的。而最後一位校驗碼,就是檢查身份證是否正確的主要依據。它的計算方法,主要是由前17位乘以不同的系數,最後的總和除以11。在這種情況下,得到的余數,就是校驗碼。

那麼我們在反推的時候,就可以用身份證號乘於系數,當最後得出的余數和末尾校驗碼不同時,就代表這個身份證,是一個假的身份證,不符合我們國家的標准。另外,余數對應的數字不同,並不是說余數就一定是最後一位身份證號碼。

3、為什麼除以11

看到整個計算過程,我們會發現,想要得出校驗碼,並非一件易事。不過在計算中,有人可能會提出疑問,最終的除以為什麼是取11,而不是其他數字。

其實這個問題的答案很簡單,結合校驗碼的功能,11是最容易檢測出問題的存在。同時,它可以覆蓋到大多數身份證,方便進行校驗。畢竟一個國家人口眾多,校驗碼要做到盡可能覆蓋所有人。

『肆』 驗證碼技術如何區分人類和計算機

在CAPTCHA 測試中,作為伺服器的計算機會自動生成一個問題由用戶來解答。這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答 CAPTCHA 的問題,所以回答出問題的用戶就可以被認為是人類。 CAPTCHA 是由計算機來考人類,而不是標准圖靈測試中那樣由人類來考計算機,因此人們有時稱 CAPTCHA 是一種反向圖靈測試。 一則有關驗證碼的笑話 驗證碼是否真的保護了計算機系統 yixieshi.com 一隊來自斯坦福大學的研究人員指出很多驗證碼完全沒有發揮應有的作用。這些研究人員甚至設計了一個通用程序,這個程序能夠以極高的成功率識別出許多網站上的驗證碼,包括 Visa 旗下網站 Authorize.net ,暴雪官方網站, eBay ,以及維基網路。 這種識別技術用到了機器人視覺領域的一種概念模型,它有助於機器人不受圖像噪點的干擾正確識別物體的外形。斯坦福這個名為 Decaptcha 的工具使用上述指導思想編寫的演算法能夠將扭曲變形且充滿噪點的圖片分割成可以通過光學識別技術( OCR )辨別的字母和數字。 」大多數驗證碼投入使用之前都沒有經過必需的驗證,也缺少可靠性測試。「 來自斯坦福大學安全實驗室的研究人員 Elie Bursztein 博士後說:」我希望我們的研究能夠讓人們更為慎重的對待驗證碼的設計和使用。「 互聯網的一些事 Decaptcha 能夠成功識別 66% Visa 支付網站 Authorize.net 上的驗證碼圖片,並可以順利攻陷暴雪娛樂網站上 70% 的驗證碼。而維基網路有四分之一的驗證碼可以辨識,在 CNET 以及 Digg.com 上這個數字降低到了五分之一。來自斯坦福的這個研究團隊隨後指出,任何可辨識率超過 1% 的驗證碼系統都不應該被繼續使用下去。 各大網站的驗證碼識別率: 隨後暴雪發表聲明說,他們明確的知道驗證碼技術並不具有足夠高的安全性。」我們僅在初級安全層使用驗證碼技術抵擋一些特定的攻擊,比如注冊環節。我們使用一些更為安全可靠的技術來保護我們的客戶與骨幹伺服器。「來自暴雪的 Shon Damron 這么說。 如今的驗證碼 驗證碼技術在目前的網路世界中仍然十分重要,它有助於阻止自動機器人批量注冊網路郵箱並發送垃圾郵件,還能防止留言板被自動程序填塞廣告,甚至使投票系統更能反映真實情況。 各大網站所使用的驗證碼範例: 新浪微博所使用的中文驗證碼範例——似乎沒有考慮到國際化的情形: yixieshi.com 到目前為止,只有 Google 的驗證碼完全阻擋了 Decaptcha 的辨識, Google 在 2009 年從卡耐基梅隆大學收購的 ReCaptcha 項目也表現出了極其高的可靠性。目前 ReCaptcha 已經被廣泛地使用在了近 10 萬網站上,這些網站包括 Twitter 、Facebook、Craigslist、TicketMaster (一個出售各類演唱會、體育比賽、歌劇以及藝術展覽門票的網站)以及微軟( Microsoft )。 Bursztein 希望開發者能夠更加系統的設計和使用驗證碼技術,他舉了一個例子: 20 世紀 80 年代人們通常埋頭設計的自己的計算機程序演算法,但隨著時間的推移,大家發現對等測試和專業安全性評估也是非常重要的。 展望驗證碼的未來 yixieshi.com 較早前有報道指出, Google 正在測試一種新的驗證碼技術,這種驗證碼技術不像傳統驗證碼系統要求輸入文字,而是要求用戶將圖形旋轉到正確的方向: 另一種基於圖像的驗證碼: yixieshi.com 類似的驗證碼還有要求用戶輸入當前時間,所訪問的網站域名,自己所在的時區,甚至美國總統姓名,人類第一顆登陸的地外星球等。這類驗證碼主要考慮到通常自動計算機程序沒有足夠的邏輯思考能力,不能辨識並解答邏輯問題。拼圖驗證碼,找不同驗證碼(比如從幾張貓的圖片中找出一張狗的圖片)的驗證碼從本質上來說也非常類似,但目前沒有大規模部署這類驗證碼的主要原因是沒有足夠的資源,難以抵擋窮舉攻擊(攻擊者多次刷新驗證碼後可能出現相同的問題)。 要求用戶繪制圖形的驗證碼: 要求用戶完成復雜算術題的驗證碼——顯然過於復雜而顯得不友好: 驗證碼也帶來了更多的可能性,比如通過廣告盈利的機遇,下面這則驗證碼示範了利用驗證碼展示廣告: 但遺憾的是由於其同樣不具有規模性,仍受到窮舉攻擊的威脅。 這些未來的驗證碼技術同時還應該考慮到輔助功能。假如用戶有視力障礙,他應該可以選擇通過聆聽驗證碼音頻的方式完成驗證,這也是基於字元的驗證碼技術遲遲未能被取代的主要原因之一。 互聯網的一些事 總結 驗證碼技術是一種計算機技術發展下的矛盾產物,人類渴望計算機能夠通過自動化的過程完成更多的任務,卻同樣要防止計算機被利用在破壞與惡意的用途當中。隨著人工智慧領域的研究成果越來越先進,計算機將變得越來越通情達理(想想 Siri ,想想 IBM 最新的超級智能計算機 Watson)。 圖靈當年設計圖靈測試時,旨在推動人工智慧的發展,並從哲學與計算機科學的角度上論證製造類人類機器人的可行性,但他恐怕永遠也想像不到有一天,人類將如此迫切的需要一種技術來將自己與計算機系統嚴格地區分開來。

『伍』 為什麼網頁的驗證碼的字母總是那麼難辨認

我來說下自己的想法,本人在一家做圖像識別的公司呆了三年,做銷售工作。識別驗證碼的使用的技術是光符字元識別技術,即OCR技術,就是將圖片中的文字識別為電子流的技術。這項技術目前已經得到廣泛應用,比如掃描識別,身份證識別,銀行卡號識別,車牌識別等等。驗證碼識別也是其中一種,也是難度比較大的一種。為什麼難呢,一方面是因為它總體來說沒有規律,無法使用模版識別方式,身份證識別是典型的模版識別方式,因為身份證識別位置是固定的。另一方面是各類因素影響識別率較大,比如傾斜,背景等。總的來說就是目前ocr技術無法使驗證碼識別率達到一個滿意的效果。哪些核心技術限制了它的識別率呢?

1.傾斜矯正技術。整個識別驗證碼流程大概是這樣的。先將驗證碼區域圖像獲取下來,進行二值化,將圖片中的字元一個一個切分出來,分別進行識別,輸出整體識別結果。當一個字元是歪的時候(此處說的歪是大於一定角度的,具體記不清了,但驗證碼中經常出現),切下來後無法進行傾斜矯正,那麼計算機可能認為要識別的字就是這樣的,識別後肯定是錯誤的。為什麼不能進行傾斜矯正呢?因為傾斜矯正是需要一個基準點的,比如身份證識別可以拿照片位置做記住點,這樣傾斜多少度識別引擎是知道的,就可以矯正,但驗證碼沒有。所以驗證碼識別這傾斜矯正是一個難點!

2.圖像質量影響。目前的ocr技術一般都需要二值化,即將彩色圖片變為黑白的後再進行切分識別。但這塊有個痛點,就是背景顏色要比識別的字顏色要淺這樣識別才有保證,但驗證碼有的不是這樣,影響了識別率。另外就是獲取但的圖片解析度不夠,ocr識別是需要每個字要有一定的dpi的,驗證碼很多字達不到,ocr識別率當然差。不要跟我說你能看清,因為人往往是理想的,但技術是腳踏實地的,這塊後邊我會說。為什麼有些網站的驗證碼特別簡單,以上的問題基本沒有,ocr識別率應該不低,卻沒人做識別插件呢?這個需要從商務角度說,我認為有以下幾點:

1.還是識別率不夠高。對於需要這項技術的公司,一般都是做產品的,他們會對用戶體驗這塊非常的關注。你設想一下,當你搶票的時候,驗證碼識別結果一出來,竟然有兩個字元是錯的,你還要去改,你肯定會罵娘,嘮叨不如老子自己手輸了。對於這些產品公司他們肯定會關注這點啊,所以有些這塊不是強需求的公司就不做這塊了。但對於有些產品,這塊用戶需求巨大,比如搶火車票的這種產品,這塊是競爭的一個巨大優勢,在目前技術達不到非常高的識別率又不想太影響用戶體驗情況下,他們是怎樣做的呢?先要說下引擎的識別結果不是只有一個的,而是很多計算機認為可能的結果,每個結果都有一個分數,最後選分數最高的一個為輸出結果。通過大量訓練比對,可模糊確定界定正確和不正確結果的一個值。好了回到之前的問題,產品公司通過這個值來只輸出他們認為絕對正確的結果,而有的所有識別結果都沒超過這個值,那就不輸出了,用戶自己填。這樣做的好處是,減少了用戶一定的操作,又不太影響用戶體驗。真是印證了我們總跟客戶說的那句話,目前這些技術只能減輕用戶的工作量,而不能完全代替!之前這種方法效果也不是太好,因為這個值太難界定,錯誤率也不低,所以一些有錢的公司是這樣做的:買兩家技術,識別結果進行比對,輸出比對一樣的即他們認為絕對准確的結果,比對不一樣的結果則不輸出,這種方法是目前比較好的方法,但成本比較高。老版本的智行火車票好像就這么做的。

2.驗證碼設定奇葩。我們想輸入省事兒設定驗證碼的肯定要阻止啊,出了一批連人都不容易知道怎麼輸的驗證方式,這已經超出圖像識別領域,尤其是一些流量大的公司,圖片我都看不懂計算機能懂么!

3.技術自主研發公司的壁壘。這些技術公司也要發工資吃飯的,驗證碼識別只是圖像識別應用的很小一部分,和主流的市場需求量大的身份證識別,銀行卡識別,票據識別比需求量還是小,況且有重重阻礙,技術推動力自然小,技術進步很慢。好了,以上回答按照我的理解基本可以解答題主問題,目前驗證碼識別應用率不高主要因為技術瓶頸和市場阻礙因素。下面我說點題外話,僅代表我個人觀點,不吐不快。當我剛開始做核心技術銷售的時候和後段技術人員沖突很多。以題主想法舉例,銷售站在客戶角度認為既然能夠看清,圖片效果不錯,那識別應該問題不大。而後端技術給出的結果是無法保證,那麼沖突來了,是我一廂情願過於理想還是技術不給力。當我全程看到他們做的事之後,才改變了我的認知。為了提升零點幾的識別率,他們需要大量的數據進行訓練,這些數據收集來的少大多是買來的,特別貴。大量數據拿來後經過初步的過濾,技術人員通過演算法進行切分。你能想想幾T的全文字圖片數據切分成單個字元有多少么。然後需要數據部門大量人工對這些字元進行人工標注(標注每個字元圖片的識別結果),這個時間可能是通宵達旦的幾天,可能是幾個月。然後將分類好的字元拿給技術進行初步訓練,然後統計,優化演算法。好,再來一輪,訓練,優化演算法。一遍一遍,直到達到預期目標。這里需要大量的人工參與,大量的資金,大量的時間為了提升一點點的識別率。這還不算核心技術人員腦洞大開的精力和時間,還有進行前期實驗的時間。我不止一次看到他們冥思苦想,通宵達旦,反復實驗。說實話,我看著都枯燥,都累。但就是這些我們所說的碼農單身狗,讓人機智能交互技術一點一點在往前走,腳踏實地。往小了說這是他們的職責,往大了說他們就是在默默無聞的改變我們的生活!為什麼我之前會給客戶肯定答案呢?因為我理想,想當然,對技術不了解,或者說根本不了解他們在做什麼!所以請不要像我以前一樣在不了解實際情況之前說:這是可以做的啊,看著挺簡單啊,為什麼沒人做啊?不去了解如何知道可以,如何知道簡單,如何知道這東西沒人在做?只是不了解不知道罷了,這是對默默無聞搞研究的技術人員的一種不尊重!如果現在在遇到不敢肯定的技術問題,我會坦然的跟客戶說:不好意思,這塊我確實不是很清楚,我需要問下我們專業的技術人員。

『陸』 識別驗證碼的演算法

一、驗證碼的基本知識
1. 驗證碼的主要目的是強制人機交互來抵禦機器自動化攻擊的。
2. 大部分的驗證碼設計者並不得要領,不了解圖像處理,機器視覺,模式識別,人工智慧
的基本概念。
3. 利用驗證碼,可以發財,當然要犯罪:比如招商銀行密碼只有6位,驗證碼形同虛設,計
算機很快就能破解一個有錢的賬戶,很多帳戶是可以網上交易的。
4. 也有設計的比較好的,比如Yahoo,Google,Microsoft等。而國內Tencent的中文驗證
碼雖然難,但算不上好。
二、人工智慧,模式識別,機器視覺,圖像處理的基本知識
1)主要流程:
比如我們要從一副圖片中,識別出驗證碼;比如我們要從一副圖片中,檢測並識別出一張
人臉。 大概有哪些步驟呢?
1.圖像採集:驗證碼呢,就直接通過HTTP抓HTML,然後分析出圖片的url,然後下載保存就
可以了。 如果是人臉檢測識別,一般要通過視屏採集設備,採集回來,通過A/D轉操作,存為
數字圖片或者視頻頻。
2.預處理:檢測是正確的圖像格式,轉換到合適的格式,壓縮,剪切出ROI,去除噪音,灰度
化,轉換色彩空間這些。
3.檢測:車牌檢測識別系統要先找到車牌的大概位置,人臉檢測系統要找出圖片中所有
的人臉(包括疑似人臉);驗證碼識別呢,主要是找出文字所在的主要區域。
4.前處理:人臉檢測和識別,會對人臉在識別前作一些校正,比如面內面外的旋轉,扭曲
等。我這里的驗證碼識別,「一般」要做文字的切割
5.訓練:通過各種模式識別,機器學習演算法,來挑選和訓練合適數量的訓練集。不是訓練
的樣本越多越好。過學習,泛化能力差的問題可能在這里出現。這一步不是必須的,有些識
別演算法是不需要訓練的。
6.識別:輸入待識別的處理後的圖片,轉換成分類器需要的輸入格式,然後通過輸出的類
和置信度,來判斷大概可能是哪個字母。識別本質上就是分類。
2)關鍵概念:
圖像處理:一般指針對數字圖像的某種數學處理。比如投影,鈍化,銳化,細化,邊緣檢測,
二值化,壓縮,各種數據變換等等。
1.二值化:一般圖片都是彩色的,按照逼真程度,可能很多級別。為了降低計算復雜度,
方便後續的處理,如果在不損失關鍵信息的情況下,能將圖片處理成黑白兩種顏色,那就最好
不過了。
2.細化:找出圖像的骨架,圖像線條可能是很寬的,通過細化將寬度將為1,某些地方可能
大於1。不同的細化演算法,可能有不同的差異,比如是否更靠近線條中間,比如是否保持聯通
行等。
3.邊緣檢測:主要是理解邊緣的概念。邊緣實際上是圖像中圖像像素屬性變化劇烈的地
方。可能通過一個固定的門限值來判斷,也可能是自適應的。門限可能是圖像全局的,也可
能是局部的。不能說那個就一定好,不過大部分時候,自適應的局部的門限可能要好點。被
分析的,可能是顏色,也可能是灰度圖像的灰度。
機器視覺:利用計算機來模式實現人的視覺。 比如物體檢測,定位,識別。按照對圖像
理解的層次的差別,分高階和低階的理解。
模式識別:對事物或者現象的某種表示方式(數值,文字,我們這里主要想說的是數值),
通過一些處理和分析,來描述,歸類,理解,解釋這些事物,現象及其某種抽象。
人工智慧:這種概念比較寬,上面這些都屬於人工智慧這個大的方向。簡單點不要過分
學院派的理解就是,把人類的很「智能」的東西給模擬出來協助生物的人來處理問題,特別是
在計算機裡面。

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

1摘要

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

然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):

基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)

2關鍵詞

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

3免責聲明

本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。

本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。

本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。

本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。

本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。

4引言

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

互聯網安全防火牆(1)--網路驗證碼的科普

裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。

5基本工具

要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。

主要開發環境:

『捌』 如何對中文驗證碼中的文字進行拆分,旋轉和切割(python),為了容易識別一點

#-*-coding:utf-8-*-

importImage,ImageDraw,ImageFont

importrandom

importmath,string

classRandomChar():

"""用於隨機生成漢字"""

@staticmethod

defUnicode():

val=random.randint(0x4E00,0x9FBF)

returnunichr(val)

@staticmethod

defGB2312():

head=random.randint(0xB0,0xCF)

body=random.randint(0xA,0xF)

tail=random.randint(0,0xF)

val=(head<<8)|(body<<4)|tail

str="%x"%val

returnstr.decode('hex').decode('gb2312')

classImageChar():

def__init__(self,fontColor=(0,0,0),

size=(100,40),

fontPath='wqy.ttc',

bgColor=(255,255,255),

fontSize=20):

self.size=size

self.fontPath=fontPath

self.bgColor=bgColor

self.fontSize=fontSize

self.fontColor=fontColor

self.font=ImageFont.truetype(self.fontPath,self.fontSize)

self.image=Image.new('RGB',size,bgColor)

defrotate(self):

self.image.rotate(random.randint(0,30),expand=0)

defdrawText(self,pos,txt,fill):

draw=ImageDraw.Draw(self.image)

draw.text(pos,txt,font=self.font,fill=fill)

deldraw

defrandRGB(self):

return(random.randint(0,255),

random.randint(0,255),

random.randint(0,255))

defrandPoint(self):

(width,height)=self.size

return(random.randint(0,width),random.randint(0,height))

defrandLine(self,num):

draw=ImageDraw.Draw(self.image)

foriinrange(0,num):

draw.line([self.randPoint(),self.randPoint()],self.randRGB())

deldraw

defrandChinese(self,num):

gap=5

start=0

foriinrange(0,num):

char=RandomChar().GB2312()

x=start+self.fontSize*i+random.randint(0,gap)+gap*i

self.drawText((x,random.randint(-5,5)),RandomChar().GB2312(),self.randRGB())

self.rotate()

self.randLine(18)

defsave(self,path):

self.image.save(path)


『玖』 python pil 怎麼去掉驗證碼線條

一、驗證碼識別的概念

機器識別圖片主要的三個步驟為消去背景、切割字元、識別字元。而現有的字元驗證碼也針對這三個方面來設計強壯的驗證碼。

以下簡圖幫助大家理解驗證碼識別的流程:

二、處理流程

其中最為關鍵的就是好圖像處理這一步了。圖像處理功能模塊包括圖像的灰度化、二值化、離散雜訊點的去除、傾斜度校正、字元的切割、圖像的歸一化等圖像處理技術 。

1、 圖像的灰度化
由於 256 色的點陣圖的調色板內容比較復雜,使得圖像處理的許多演算法都沒有辦法展開,因此有必要對它進行灰度處理。所謂灰度圖像就是圖像的每一個像素的 R、G、B 分量的值是相等的。彩色圖像的每個像素的 R、G、B 值是不相同的,所以顯示出紅綠藍等各種顏色。灰度圖像沒有這些顏色差異,有的只是亮度上的不同。灰度值大的像素點比較亮(像素值最大為 255,為白色),反之比較暗(像素值最小為 0,為黑色)。圖像灰度化有各種不同的演算法,比較直接的一種就是給像素的 RGB 值各自一個加權系數,然後求和;同時還要對調色板表項進行相應的處理。

2、 圖像的二值化
要注意的是,最後得到的結果一定要歸一到 0-255 之內。因為這是每個位元組表示
圖像數據的極限。

3、 去噪
圖像可能在生成、傳輸或者採集過程中夾帶了雜訊,去雜訊是圖像處理中常用的手法。通常去雜訊用濾波的方法,比如中值濾波、均值濾波。但是那樣的演算法不適合用在處理字元這樣目標狹長的圖像中,因為在濾波的過程中很有可能會去掉字元本身的像素。

一個採用的是去除雜點的方法來進行去雜訊處理的。具體演算法如下:掃描整個圖像,當發現一個黑色點的時候,就考察和該黑色點間接或者直接相連接的黑色點的個數有多少,如果大於一定的值,那就說明該點不是離散點,否則就是離散點,把它去掉。在考察相連的黑色點的時候用的是遞歸的方法。此處,我簡單的用python實現了,大家可以參考以下。

#coding=utf-8"""
creat time:2015.09.14
"""import cv2import numpy as npfrom matplotlib import pyplot as pltfrom PIL import Image,ImageEnhance,ImageFilter

img_name = '2+.png'#去除干擾線im = Image.open(img_name)#圖像二值化enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
data = im.getdata()
w,h = im.size#im.show()black_point = 0for x in xrange(1,w-1): for y in xrange(1,h-1):
mid_pixel = data[w*y+x] #中央像素點像素值
if mid_pixel == 0: #找出上下左右四個方向像素點像素值
top_pixel = data[w*(y-1)+x]
left_pixel = data[w*y+(x-1)]
down_pixel = data[w*(y+1)+x]
right_pixel = data[w*y+(x+1)] #判斷上下左右的黑色像素點總個數
if top_pixel == 0:
black_point += 1
if left_pixel == 0:
black_point += 1
if down_pixel == 0:
black_point += 1
if right_pixel == 0:
black_point += 1
if black_point >= 3:
im.putpixel((x,y),0) #print black_point
black_point = 0im.show()041424344

原驗證碼:

4、分割
圖像中一般會含有多個數字,識別的時候只能根據每個字元的特徵來進行判斷,所以還要進行字元切割的工作。這一步工作就是把圖像中的字元獨立的切割出來。

具體的演算法如下:

第一步,先自下而上對圖像進行逐行掃描直至遇到第一個黑色的像素點。記錄下來。然後再自上而下對圖像進行逐行掃描直至找到第一個黑色像素,這樣就找到圖像大致的高度范圍。

第二步,在這個高度范圍之內再自左向右逐列進行掃描,遇到第一個黑色像素時認為是字元切割的起始位置,然後繼續掃描,直至遇到有一列中沒有黑色像素,則認為這個字元切割結束,然後繼續掃描,按照上述的方法一直掃描直至圖像的最右端。這樣就得到了每個字元的比較精確寬度范圍。

第三步,在已知的每個字元比較精確的寬度范圍內,按照第一步的方法,分別進行自上而下和自下而上的逐行掃描來獲取每個字元精確的高度范圍。

5、 圖像的歸一化
因為採集的圖像中字元大小有可能存在較大的差異,或者是經過切割後的字元尺寸不統一,而相對來說,統一尺寸的字元識別的標准性更強,准確率自然也更高,歸一化圖像就是要把原來各不相同的字元統一到同一尺寸,在系統實現中是統一到同一高度,然後根據高度來調整字元的寬度。具體演算法如下:先得到原來字元的高度,跟系統要求的高度做比較,得出要變換的系數,然後根據得到的系數求得變換後應有得寬度。在得到寬度和高度之後,把新圖像裡面的點按照插值的方法映射到原圖像中。

不少人認為把每個字元圖像歸一化為 5×9 像素的二值圖像是最理想的,因為圖像的尺寸越小,識別速度就越高,網路訓練也越快。而實際上,相對於要識別的字元圖像, 5×9 像素圖太小了。歸一化後,圖像信息丟失了很多,這時進行圖像識別,准確率不高。實驗證明,將字元圖像歸一化為 10×18 像素的二值圖像是現實中是比較理想的,達到了識別速度快和識別准確率高的較好的平衡點。

三、識別

圖像識別包括特徵提取、樣本訓練和識別三大塊內容。

驗證碼識別其中最為關鍵的就是去噪和分割,這對你的訓練和識別的精度都有著很大的影響。這里只講了大致的流程,其中每個細節都有很多工作要做,這里碼字也很難講清楚,大家可以以這個流程為主線,一步步的實現,最終也就能完成你的需求。

『拾』 易語言QQ驗證碼怎麼做

驗證碼是簡單的數字或字母,規則且不勾,不連,不交叉,顏色基本統一的; 將規則的數字或字母按某種規則掃描後的特徵碼存入相應的數組; 本方法只適用指定的驗證碼圖片,具體表現在切割尺寸上;製作思路:打開載入圖片到畫板1----->整體掃描(遍歷)畫板1---->根據畫板1的某點的顏色值做出判斷 ----大於某個值在編輯框里加入「X」,否則加入「.」----->然後切割,即:按切割尺寸復制 到另外四個畫板----->對四個畫板掃描,一樣根據顏色值做出判斷,一樣加入另外四個編輯框 ---->最後根據四個編輯框里的「特徵碼」和我們之前規則數字或字母的特徵碼對比,相似度 高的就是我們所要的數字或字母;..

閱讀全文

與驗證碼切割演算法相關的資料

熱點內容
mdr軟體解壓和別人不一樣 瀏覽:884
單片機串列通信有什麼好處 瀏覽:320
游戲開發程序員書籍 瀏覽:843
pdf中圖片修改 瀏覽:269
匯編編譯後 瀏覽:474
php和java整合 瀏覽:829
js中執行php代碼 瀏覽:440
國產單片機廠商 瀏覽:57
蘋果手機怎麼設置不更新app軟體 瀏覽:284
轉行當程序員如何 瀏覽:492
蘋果id怎麼驗證app 瀏覽:864
查看手機命令 瀏覽:953
抖音反編譯地址 瀏覽:226
如何加密軟體oppoa5 瀏覽:233
java從入門到精通明日科技 瀏覽:96
拆解汽車解壓視頻 瀏覽:598
新版百度雲解壓縮 瀏覽:593
android上下拉刷新 瀏覽:880
centos可執行文件反編譯 瀏覽:839
林清玄pdf 瀏覽:271