由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!
6 Z) C% n; a. p2 T @2 {7 G W- c. h# ~% t: z" o# f
廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!
! c- S* C" ]7 u5 S F: Q" N
1 i4 h+ e; ?( J% D6 _4 R; { 我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)
% p, S3 t+ q5 K: z; |+ x
5 m/ O5 o! {1 ^6 q6 R. F2 B' K0 }/ n 首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。' i8 H4 g0 C3 i: L4 f/ u
. L @2 k9 U& t9 t& }) b0 Z
驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。
( M1 `0 H w" P7 {/ t8 V8 I! {' f' ?* f2 f& b) c
我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!
' t8 U5 n7 t) g) E% q8 K○■○
- a9 W- {+ |- ?$ G y% P& H. u3 Q■○■
5 f; \* _+ C( j _: J' W, u A■○■4 n* \# K. J8 O+ D1 g* O
■○■+ {4 x# O2 [8 J" k2 }
○■○
" ]7 e( Y) g3 ~4 @, b% b& l0 M
9 i: _% o8 `0 J○■○
) w5 m! M: e4 K' I; |- |) \5 k9 [( u8 z■■○
- {- H3 P. M' A# }○■○
O' ^1 i9 E8 X6 @0 S○■○
" i' k3 f* y! i8 M0 y! K8 d■■■
$ Z/ a+ l) j7 E) N* t
) I+ @; [+ ]) d■■■
_ U/ U( V/ `& _$ K8 G6 H○○■' e: O" c1 X8 M7 ?( M, y
■■■+ \3 y/ S4 W4 }2 N
■○○" f/ n, V$ Z* n
■■■
4 w+ c: C' ?- m: \* B
& `$ s! V9 F w' l& T0 d; s■■■3 P; {+ M \0 Y5 t
○○■5 k( j+ E8 X# a" C) g0 B
■■■) d' }3 M" R+ r. q% J
○○■
* a6 y/ I6 R: v ?7 b9 q9 e■■■7 K" [' A$ r5 c1 t/ X1 _
我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。
9 |$ ]* M' M% ~5 d$ S' ?
+ f) G- g8 A6 x' l+ d: r 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!0 s; Y4 u8 ?8 k
! c5 f2 b) D& o 如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^" L W+ Y; z5 D! @3 N+ t* }! s
2 o3 G) X4 v: v* h* { 如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:
$ |5 K" |( l) H9 g5 z○■○$ f( U- a. t. d0 h, i( ?7 U; C
○○■ K) e9 b! U! R6 ^* d
○■○' y& n. o. U# p/ i* i/ [
■○○
3 @0 r9 v' G; `7 I+ r9 p' [■■■
% n6 i4 ]. [$ f1 y 那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。* o2 j' J9 k) O2 D& |* j h
5 M& C; e) P+ I8 K: M
寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。2 |) g+ b5 l) u& ^' m% u3 a
再舉一個例子:$ y" A; I( W# ~2 e
○■○
4 i7 ]! } Z& O- D* w$ ?■○○( ~! T% U& W$ v! f0 q
■■■
; a; U: G7 D& t0 \0 U■○■
$ T* _1 C( H6 ]! J! R: n" K% x○■○1 {* W% S Z2 a0 W2 r, l: I& v
這是哪個數字呢??是6,沒錯* v# s$ o5 y* _
1 z) L& r( A) Y( V5 ?& B$ J' ^
我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。0 a" X' {/ N( W1 V% e/ o( M' }
8 U. F9 |* p# a( s) N V6 j* Q 另外你取的百分比也需要注意,不能太大也不能太小。
7 g& e7 I f& a0 M0 a( ?3 b9 e
0 |7 u; o$ I! o3 ~ 好了,等做好自己的數據庫,這時就可以識別大部分數字了。
7 T8 V4 b: y7 l
+ p$ ?2 X0 u5 n5 U 最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖:* Q( _( X# }3 u7 e0 d
■■■
5 w5 B6 T, V! M/ Z/ n6 Q! M+ D■○○( _0 h/ p o4 L2 z# u9 G
■■■5 a1 L* u- e3 V0 J: _2 A$ l. e
■○■
2 m# S8 ?4 @2 t; x■■■5 Y; g- Z8 Q+ k, j8 y+ a, K" b
在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?( L7 ?& R6 G/ f, ~8 L; z( D& P! B
7 Q7 w- t3 k/ B6 C3 P 我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。
. p0 C3 }1 |( h- o! M: _( h [! P' j0 l8 {* B! _* r( f) I
遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:( e, g) R' b) ~& l7 c
■■○
0 e/ C1 B P3 q& h3 T■○○7 h& D+ h1 x, q
■■○
; _$ i6 ]3 f, s0 i( u! C! F3 P○○■
6 j) u; o4 ^9 X5 |■■○
; G. u; \# i- P5 W+ I$ D4 o OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。 |
|