目前大部分驗證碼都是文字的序列,因此現有的識別方法,大都來自ocr(光學字元識別)的技術。 ocr用於印刷體掃瞄後文字的識別,一般分為三個步驟:
1、預處理
因為有些印刷文字會存在字跡不清、汙點、顏色不統一等問題,所以在最開始都要對影象進行預處理。這些處理包括邊緣檢測、二值化等操作。邊緣檢測就是根據顏色和圖形的特徵,檢測出乙個文字的邊緣,這樣就可以得到文字的輪廓。而二值化就是將變成黑白的,有些驗證碼將背景和文字變為不同顏色,實際上在這一步會被識別出來。如果驗證碼的設計要增加預處理的難度,就需要增加更大的噪點、使用色彩漸變等方式使文字更加難以分辨,但是這樣做也同時增加了人識別的難度。而這部分來說,計算機和人的識別能力差不多,甚至要優於人的識別力。所以在這方面做的工作效果並不好。
2、字元分割
我們人類閱讀經常說「一目十行」,但是計算機識別大段的文字,卻只能按照乙個乙個文字進行識別。字元分割就是將文字拆分成乙個個的字元,以便於單獨進行識別的過程。為什麼要這麼做呢?這要從ocr的核心:影象識別技術說起。
影象識別 的基本原理都是一樣的:給計算機乙個影象集合a,告訴計算機這些影象分別對應的含義,等它「學懂」後,然後再讓它去判斷新的影象b,跟集合a中的哪個影象(或者哪類影象)更相似,再藉此判斷它的含義。這個過程又有個很形象的名字叫「機器學習」。在機器學習的術語裡,集合a稱為「訓練集(training set)」,a的含義叫做「標記(label)」,學習的過程叫做「訓練(training)」,推斷a的含義的過程叫做「分類(classify)」或者「標註(labeling)」,而把影象轉化成計算機能理解的過程叫做「特徵提取(feature extract)」。
這個過程有個很大的問題,在於訓練集的規模。 計算機的儲存能力是很強的,推理能力卻是很弱的,給它乙個"abcd"組合的,告訴它"這是abcd",如果演算法足夠強大,它以後能夠識別出所有"abcd"組合的,但是它絕無可能識別出乙個"acbd"組合的。這種情況下,如果要識別「acbd」,那麼必須再設計一套"acbd"組合的。如果是6位的驗證碼,每位由大小寫和數字組成,那麼一共有(26*2+10)^62=56,800,235,584種可能,就需要設計這麼多種讓計算機去學習。這顯然是難以實現的。還有一種做法是將拆開,拆成乙個個小區域,一次只識別乙個字母,這樣每個區域需要識別的型別就大大減少。仍以驗證碼為例,此時僅需要52張作為訓練即可。
所以,字元分割可以大大降低驗證碼識別的難度。字元分割方面用到的技術更多,不過在這方面,人卻比計算機有較大的優勢。目前一種較安全的驗證碼設計方式就是直接在所有字母中加一條橫線,對人類閱讀幾乎無影響,對計算機切分就比較困難了。還有一種做法是將所有字母變化並重合在一起,這樣也能起到難以分割的效果。
橫線分割的驗證碼
扭曲的驗證碼
3、字元識別
字元識別使用的就是上面說到的影象識別方法。只要切分成功,那麼影象識別的任務就是識別乙個區域的影象對應的字母。很多驗證碼技術都對字母進行了變形,最常見的就是扭曲。但是破解者同樣可以將扭曲後的文字作為訓練集交給計算機。假設一種文字有100種扭曲方法,那麼實際上也只有6200種情況需要計算機來判斷,這實在是小菜一碟。
驗證碼識別技術
由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的辦法是...
驗證碼識別技術
原文 由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的...
車牌 驗證碼識別技術
車牌 驗證碼識別的普通方法為 1.將灰度化與二值化。2.去噪,然後切割成乙個乙個的字元。3.提取每乙個字元的特徵,生成特徵向量或特徵矩陣。4.分類與學習。將特徵向量或特徵矩陣與樣本庫進行比對,挑選出相似的那類樣本,將這類樣本的值作為輸出結果。下面藉著 描述一下上述過程。1.的灰度化與二值化 這樣做的...