由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!8 A- n2 X$ o4 p
; ], Z& O# k* g* Z- @1 ~7 h1 H
廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!* Z6 w) S( j6 ^6 ]& Y
4 ^ N" I' }& [2 o8 W n( k+ }
我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)
$ L' ~" W% Z! x [
! f+ p4 p/ P |" Y/ E$ t: Y 首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。& ]+ @( v; [8 p% m [
, b, g/ {) p' c: Q$ } 驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。& M' w. _2 @; j7 O
4 `2 W+ M+ C- b \' T 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!
& J5 p G* I9 R- D- B: L○■○ $ s( u7 A2 b$ } ~. b
■○■
8 ]0 O$ v9 c2 F7 ?" p; u4 p& O■○■" n7 W. V# u& Z, l' e
■○■
8 k$ ^3 Q/ [4 v H X○■○
. q' ~: \6 i, w5 Q
) ? {' _" J8 x+ `○■○% y7 L7 F @# H" d* q% z
■■○
9 H3 u0 ^- x. |$ j7 u○■○
" i' I, u7 D6 y2 M4 Y8 [○■○
, J. O3 w1 v8 I/ k: w■■■
2 D( ?! c# o, z+ x+ r
' ~/ p# z8 i9 R0 i■■■4 h; {" a- r/ s. m6 f8 {, k
○○■
* v6 z/ o+ M; h9 J# B' {7 h■■■
7 \" n8 c5 {$ V& A# n) X: E■○○
7 j' a+ E9 ? q( n! \■■■
, d1 w% X: _# t
. r' B! [! ^: ~! h* u■■■
, S; V9 W! G6 Z) t○○■
* X. x% q' M1 y, U: ~7 z■■■
5 b; o" X1 L" C. r○○■7 z1 u/ V. J/ p# j
■■■
3 e0 v# X+ Y2 Q; @我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。+ v @' A4 E" ~; J; ?
4 f2 F; y. x: o8 j 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!* X0 Y) a) E; [2 _
! Q+ Z/ s. w- p c8 }+ m' f 如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^1 _7 J7 [0 L, u* P: `% y3 G
: Y& ]0 ]" o) S8 T! k 如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:
# `: e5 X; c3 }○■○/ `, |7 J& D7 G% _. e7 ]
○○■
/ @5 s& j2 f' D5 r- c/ x% e% E○■○. r; ^; r5 m- o5 W, T. R2 t
■○○
; M, ~+ B2 r& v- z" z4 w' [■■■' [! R B& {0 A
那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。
/ S$ b" g( @! y+ O3 M
) t" `; |: F/ w0 R8 h 寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。
8 a) ^9 a0 D4 }# i: B 再舉一個例子:! Y7 M6 U; H8 A- I5 @) x' H4 x
○■○+ y8 q+ P, v- w% \
■○○
: I6 O2 z, T3 k. g% ~! q& V■■■* {4 O5 i# ]( @0 W+ r3 H$ b
■○■; c# Z0 g9 q+ S4 B! _
○■○1 p' |# A6 V9 ]& h W% z, V9 Q$ a
這是哪個數字呢??是6,沒錯
* Q2 A1 J2 R- H; A/ a0 g9 _# [+ p# d7 ~
我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。
( `% g+ y/ @9 O/ D: u6 K& J* R
8 {3 `! h' P+ L' l8 M 另外你取的百分比也需要注意,不能太大也不能太小。
2 [' d2 n4 v& L4 R9 z$ N: }0 w9 b, Q6 {5 }1 S. f$ F7 I4 ^/ g
好了,等做好自己的數據庫,這時就可以識別大部分數字了。, ?5 T; l3 O# V0 S& a H: ~; X
& `0 G' L1 M3 E' ^ 最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖:% [5 a( {% p [( l
■■■ L4 r, l) c7 {8 w3 r6 d
■○○8 J' \& B% w1 |3 [4 \0 C" o
■■■( p7 Y d8 O% ~4 {, t0 E
■○■# o2 ~5 G$ S, T8 f
■■■
" W# d& D/ N# q; S, G 在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?& t- H, r% L$ {0 p
2 ] |' J( I- |& \6 z `/ C. S 我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。
6 x; h# D! c) Q; S) c8 |
( @9 z& ?9 r3 U+ j. a6 r( U, b2 s 遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:
$ B5 l+ q6 g* h# f* H) m2 H" [■■○
; v/ e& R5 K0 l, v+ z■○○; i9 S6 E( G6 X, [! D3 E) F
■■○
. Q* y. l1 b" z8 v( Y5 Z: H; u$ `○○■. k; [. j% Y1 x7 b& M/ C- C
■■○
0 ^* L) o3 @- X& V7 g2 M' E OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。 |
|