驗證碼識別技術(1) 邊緣檢測

2022-03-31 19:41:14 字數 2025 閱讀 9046

概述

驗證碼有時候也叫圖形碼,是一種阻止軟體進行某些自動化行為的技術。被廣泛的用於各種系統的帳號註冊、登入驗證等環節。在一定程度上驗證碼可以阻止軟體自動進行帳號密碼猜解、註冊等行為。

但迫於一些原因,我們需要自動進行上述被「禁止」的行為,這時就有乙個課題擺在我們面前:驗證碼識別技術,也可以叫做圖形識別技術、模式識別技術。

如今的驗證碼已不再像網際網路初期那麼單純,早期的驗證碼可以通過簡單的二維矩陣對比即可得出結果,因為早期的圖形碼採用固定的字型檔,並加以簡單的處理的後輸出,例如隨機產生一些噪點,和隨機修改字元顏色。

早期的圖形碼字元排列整齊,字元數量確定,甚至是固定位置,例如第乙個字元出現在 x:10 y:3 第二個字元出現在 x:25 y:3,字元大小,字元輪廓都一成不變,單色背景,或固定單色前景,對於這些驗證碼的識別不在本文的討論範疇內。本文將要討論的是字元經過扭曲、旋轉,字元數量不確定,字元位置不確定,字元大小不確定,並且背景為複雜背景(背景存在多種顏色,甚至漸變色,或是紋理圖案)高階驗證碼識別技術。本文討論的內容不但可用於**驗證碼識別領域,還廣泛用於工業、醫學,例如車牌識別、ocr印刷文字識別。但重點介紹的還是基於驗證碼的識別技術。

複雜圖形碼識別的第一步便是影象的定位與切割。其中包括如何把資訊部分(包含字元輪廓的部分)從背景中分離,並把字元切開,並把資訊部分二值化(只有黑色#000000和白色#ffffff)。如果不定位與切割影象,計算量將會是非常龐大,並且識別錯誤率極大。

對於背景較為簡單(單色)的圖形碼,背景與前景的分離,就會容易做到。單對於背景為多色、漸變色、紋理的驗證碼來說分離背景就顯得異常複雜。

這裡我們應該考慮人的思維方式,當我們看到這種驗證碼的時候,肉眼並不是先把背景進行分離,我們首先看懂了其中我們認識的前景輪廓(字元、數字),然後我們把前景移除,我們才發現原來背景是一幅帶有紋理的。

根據這個思想我們應當略過背景分離,直接尋找前景輪廓。如果我們能夠得到前景的輪廓(我們感興趣的也只是前景部分)就不必再去分離背景。如果驗證碼背景和前景沒有明顯的輪廓和反差,哪麼別說機器,就算人眼也無法辨識。

於是,我們設定乙個合理的「閾值」通過邊緣檢測演算法來把輪廓(反差強烈的部分)依次分割出來。但需要注意的是,我們提取出的部分除了包含前景(字元輪廓)還包含了其他零碎的片段,例如背景,或背景的一部分,或字元「0」中空心的部分。

邊緣檢測演算法可以用乙個詞形象的概括,那就是「燃燒」。

1,首先從x:0 y:0點開始燃燒,把相鄰並且在「閾值」限定內的畫素「點燃」,並把該畫素標記為「已點燃」。

2,從最後一次「點燃」的畫素遞迴過程1,繼續點燃「閾值」限定內的其他相鄰點。(注意每次遞迴過程要按照最後一次「點燃」畫素和當前畫素之間的色差來對比「閾值」,而不能始終以x:0 y:0點計算「閾值」,這樣才能處理漸變的背景色。)

3,當第一輪燃燒(x:0 y:0)全部熄滅後,第一次邊緣檢測便完成了,接著,遍歷圖形,尋找標記為「未點燃」狀態的畫素,並從此開始重複「燃燒」過程。直到全部畫素都被標記為「已點燃」。

不過實際操作中,遍歷函式會受到棧大小的限制,在處理過大的時候(例如300*300的),很可能會因為遍歷深度過大引起棧溢位,而讓你的程式down掉,不過可以使用其他方法,例如建立「燃燒任務表」的方法來解決這個問題。其本質還是遍歷。

一般來說我們應當拋棄掉分割後體積超過50%的部分,因為這麼大的部分,他只能是背景。分割後體積小於5%的部分也應當拋棄,這可能是背景紋理、或是噪點、干擾線,根據多次的邊緣檢測學習,我們總能夠給出乙個合理的值,率除掉大部分無關的分割結果。

經過這些過濾演算法,和精確的邊緣檢測,我們完全可以把分割後的部分填充為單色,以便於後續的識別。但是在真正的識別開始之前我們還需要對這些影象進行一些操作。

1,縮放操作,把待識別影象縮放到指定大小,乙個既能保證影象細節不過多丟失,又能盡可能小,以加快識別速度的大小,我這裡用的是24*24大小,主要是因為目前的驗證字元過於複雜(手寫體、鏤空)如果過小會丟失太多細節。

2,旋轉操作,檢測出待識別影象被旋轉的角度,並反向旋轉,以便識別。

3,影象修復,經過邊緣檢測演算法後,影象可能會有一些受損,例如中部出現鏤空點,我們需要經過一定的演算法對影象進行修復。

4,粘連、重疊圖形檢測,再次分割,或掩碼識別,針對複雜驗證碼,這是非常重要的一步,也是業界內普遍遇到的難點。

驗證碼識別技術

由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的辦法是...

驗證碼識別技術

目前大部分驗證碼都是文字的序列,因此現有的識別方法,大都來自ocr 光學字元識別 的技術。ocr用於印刷體掃瞄後文字的識別,一般分為三個步驟 1 預處理 因為有些印刷文字會存在字跡不清 汙點 顏色不統一等問題,所以在最開始都要對影象進行預處理。這些處理包括邊緣檢測 二值化等操作。邊緣檢測就是根據顏色...

驗證碼識別技術

原文 由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的...