由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!
; y: d1 v9 R- a: I5 J U& {. |5 d' g: A) _
廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!( ^4 r$ @# _6 ^1 T4 d
8 m8 f) l' P( k 我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)
" o8 K+ Y5 v* m0 x7 u% k W4 H$ u' m6 Z7 m
首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。
1 T5 m( J2 ^; f3 T4 ]. J: X. d6 ~3 B2 B7 D: l& l$ S9 y
驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。
_+ v8 D8 L5 K$ |5 k8 s! }, z* z7 O
! O- t: z; \1 G1 P 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!
' R9 ]4 |/ s6 {: N5 u0 p/ I. F6 ]9 w○■○
2 ^% r; u! {+ q& k% u/ L& K1 O■○■. Z, Z9 S$ Q$ D* s
■○■
& ?- {( P! i) Y- f■○■2 v" `' k4 Y6 q' k( z
○■○5 Z4 ?% Q, p$ n9 J
" O. w' [( Z: |1 F# Z○■○
l8 ]& s) f0 F0 v■■○
, h& w8 F ]" _5 x3 u# g# M○■○
8 O8 M& x" C* O6 y+ Z○■○5 O$ l4 G0 z& Z; [; G8 P% `
■■■
{. ?& S- W& J7 \$ Q" x( }
$ h* S) f v4 }9 K- D# W. i) N1 m- Q/ A■■■) b; `1 A, Z: O/ _- M4 n2 x; A" _
○○■& @' O. G6 |3 Y" p1 _) {( C1 l X
■■■
6 y m, @. |9 \5 P% z■○○/ x' V+ {8 r4 |- O% s
■■■- M. K* t7 {( f. R3 R, d1 U2 y
8 S" G" ]/ J- V/ D■■■
3 M" K+ u# a- J+ O* n/ L○○■
* R. K$ |9 Y6 u6 [1 ~. o, V! y! k1 K■■■
6 M4 V# R/ N4 Y5 W3 G0 j6 D: t○○■- X7 Z$ {) d+ _' u" Z# O) j& {" I; |
■■■- R' K3 `( }7 t8 w; e4 E& x0 c
我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。
3 m: v2 S- `- |) p4 C t
" j/ T9 g4 c/ f7 f9 H, I# u- P 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!8 d! y1 b+ T/ L" W2 {& h+ {: S& z
$ t, e/ t+ x3 b# D1 g m& B9 F
如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^
9 _0 g; X8 d! p6 \" t
" N+ a: S1 f' ^, z/ t4 D 如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:
, f$ H3 ]# ~ c- d○■○" R/ x- v8 d9 K5 ^
○○■( b* i9 l$ H) v, P# G8 y
○■○
* t8 G1 c; k0 e2 I; |■○○+ F8 f$ h2 h5 O; M3 S
■■■ f3 z5 `" X; w% o; t
那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。) B3 w" i. o c' M2 N* V
3 X9 X9 \) ^5 L [. N
寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。
( Q: K- k# e4 r3 A {; u) I 再舉一個例子:1 [! o7 z- ?. N, n: o
○■○7 @$ w2 m$ R* K: B
■○○
4 `) J2 A7 M# F. C' b& g■■■) x' X q' n/ g K; w6 G- k
■○■
0 N0 C' g1 B3 \! e l6 G7 ~' A, u○■○& u' P& W. ]8 z6 n5 s" U- A5 m
這是哪個數字呢??是6,沒錯
' r" A% E; S; ?4 _
+ x, Z0 F" b: P, S/ ~6 F9 D; r8 U 我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。
9 _$ p8 x- Z8 q: y( o; }' Z
" B5 |# h6 t" d; J# F) A: u7 ^1 @ 另外你取的百分比也需要注意,不能太大也不能太小。
# U4 t a- F3 J8 O. I
1 q0 w L) t+ J3 G" c0 X 好了,等做好自己的數據庫,這時就可以識別大部分數字了。
8 Z7 G h5 {9 Y7 i. R, k7 g! X0 ?0 s
最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖:: r& C( x6 m3 h9 k6 U$ p3 c! C' ]# a/ F
■■■; H/ u: _1 ` H6 i! K
■○○+ X: l* J0 Q, \( u
■■■5 b9 \! V5 x1 C8 j! O1 G! N& H! C
■○■
* f% e _) i K- Q$ A1 B- J% X■■■
* Y/ m' @2 o7 p% R 在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?& D9 u y/ K" D" L
" q3 {' M" ^: q6 j+ Q- Z 我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。
9 p' e- c& X6 w2 E7 Z' a d$ G0 E v% m9 T+ @4 X
遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:
, x' X7 F( q8 `4 k) k■■○- [; `) u, h A
■○○" `: W$ C8 S5 v9 Q x+ z2 ~" r3 \9 \
■■○8 n1 h$ a: n( a- |' h: L
○○■
' a, {, u& S$ l1 Y. {$ q■■○
# v2 G' }( i# C6 i b1 A* V OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。 |
|