由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!2 O v6 m6 ]& u* w8 q9 g
3 q* C6 w* X1 ?+ W8 Z; P
廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!# T4 ]7 X: N2 Y" B: w p4 d
2 g+ j+ X" {# d. Q" ~ J 我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)
3 i5 c+ b" m7 G! y/ l! I# J9 k# r; r9 i- }7 M- `
首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。
6 p3 d$ J7 c. o+ R* T- F* X; v! i- h! E$ `
驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。
" x$ k( ]' x' m. @' h; M
" o$ b2 c3 t% [/ s8 t5 l 我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!; u. M7 @. v* q [/ P& c
○■○
4 v/ w1 q4 [5 ?1 T' ~■○■
/ F$ o, d1 U+ A K+ a' i5 N9 j■○■
# v$ z1 B( g5 x. ^■○■
0 O/ O: r! z$ S5 S% A○■○3 {- b( V+ q2 z* g% E
. S7 x1 b8 a6 T4 n9 C
○■○7 V9 f& s9 _5 W% p- s
■■○
8 D5 ^$ G" {3 C○■○' ~; m# c0 d) S: e. |+ H& j
○■○+ `) k! t' v$ K8 X' Q& Y: O
■■■
4 E& o. G1 U' @2 K: W3 q. I9 n4 D% ^' A
■■■$ A6 S% U9 [& |/ y3 `
○○■. _. l( t$ q2 z) p( N# S! y
■■■" u0 P* N3 O" N& D, V
■○○6 `: k6 s- O5 a8 @
■■■. \/ a V4 F# p; q( L' C1 [! P8 ]
0 E7 H! n$ X4 z# X* Z■■■
2 C; W2 F+ B) D6 Z: B○○■/ l0 h- `" B" I2 c; I
■■■
1 c$ u* x( L2 f; v○○■
- `: _0 t' w0 K0 N■■■' n: |8 k; Q' e6 M7 D
我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。6 [/ N. D, L: a* R
/ C5 z9 s. {" ` T' z" c
我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!
0 r4 H. d$ ~8 H1 J: P
- E! |1 x k! x7 T$ r* A! j 如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^
) j: |: U4 K' Y( t' K" e E
& _3 k+ I% P" d, f7 a 如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:2 `, ~3 P% K8 \. R
○■○
9 G. Z! a0 ?- U5 V H) M8 E' M○○■
( M% w+ ^$ V/ K& b○■○ \' B% ~& e+ P/ A5 i/ f) P# O7 l
■○○
; x# ]: U+ k" U. C6 s: [3 {■■■0 t; q, t' l* P) {0 t* d V2 h8 p- ]
那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。
( r* R' ]) A: r4 [: y
! R8 X6 ]: ]8 I% O8 |* _# q" B! F 寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。$ I; v. M8 d8 E" T
再舉一個例子:
q! Z0 D) v' I; E# Y7 _, V4 e8 l○■○6 r M' z* y# D! f9 c S: e" w
■○○
6 t! U- {8 V* d■■■% A/ |# F. F% R: ~1 v5 E
■○■
2 ^9 J3 Z* \# A; y, X○■○) s2 t4 m3 ~. F1 O4 X
這是哪個數字呢??是6,沒錯- h4 e- O- x' g2 \ g/ r! {
i6 s: v0 V+ i 我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。
' u4 C& R D! W2 w; ?. C5 d2 d( h$ x* p1 G& C8 p& D3 I
另外你取的百分比也需要注意,不能太大也不能太小。; X* S# C9 |' E" x' l$ P% M
1 k! z: y9 {$ L8 x s
好了,等做好自己的數據庫,這時就可以識別大部分數字了。
& v" j: t( w/ b; O7 u
$ C. B6 q, c, Q* K3 v8 Q+ j" ? 最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖: I3 ]# Z4 X5 v
■■■
. O9 h; z' G: u$ n■○○
5 s- Q3 o; \ |) ?$ i■■■
( ^8 d/ F" @% o6 y( o: }2 L+ x% W■○■
* r# T" n2 ?5 E- o% K s5 A■■■4 M! b3 o- t0 K0 t" M( D" \* E
在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?1 \% U+ F* w/ @- F1 C4 G
2 S% w) B9 Q8 b
我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。4 F6 C! ^+ {, ~- j
9 Z" n E6 B: Y! U
遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:
) J$ d+ n- [: v3 |+ [■■○ D8 _" Q" w0 c
■○○
2 A- s4 ^( ~4 m( ?■■○
% I3 ?2 Y, f3 D+ n/ }& k○○■5 G- a5 V2 v4 b; G$ ?5 n2 \3 `, R: x
■■○0 U2 U7 x; P% T# }
OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。 |
|