由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!
v) Z- M: W5 ?
5 S9 w7 N% T, k9 p 廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!
- F K. V3 |3 X* ^. E, N- J
. `) O% {6 \+ A. ] 我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)% K! e5 M2 t) I! d2 [
( r: U# D# [+ S5 _5 W
首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。 ?/ Z% e0 S, \$ T: t
; A# P& r6 x) [% z9 n) } 驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。
, B& p" l0 E/ e5 U( W& U6 h+ C0 l$ c$ o; p. V* f4 ~
我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!) c( a* u( J5 y
○■○
) X/ p! K- ^& _' a [! ^+ o■○■
0 M+ h8 \' o; x; h■○■
6 ~1 H( Y( s$ Q. b■○■' Q4 }% ]2 A& L7 b8 h* L$ v1 v
○■○
* v ^" \( \5 v( ]
- P2 O5 H7 P0 X. @* K- y○■○
5 i! g$ I9 W! s! A■■○
6 g5 {+ O* j2 w9 l6 O& Y○■○
: C& S6 {$ o0 B0 A( x○■○
: d) T+ |3 b5 |/ E* _* B■■■
% w/ |: [; }( v# q5 x0 e* [: d; Y- d. V/ l' Y
■■■
) C3 c/ o: a, s, q" `! J* F+ C1 @- F○○■
i. `7 Q& ^& Z$ X■■■* }1 N- N8 G: @3 L0 q
■○○/ f; s. }% t4 b0 }0 p
■■■; ^0 i$ e+ J* i; ?& p: w
. c9 ^9 j. M( J7 ]' \; \. i■■■( z; X3 ~+ x& y# R! O9 h
○○■1 S& M) ?3 v. b4 E- q1 b
■■■
9 h: K0 t) j. n4 t, t' l○○■
) W H( }) o4 R" x4 D& n; w% v■■■* {% z' Z9 u" K
我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。
. ` I& I3 k. {) n! w+ s! O% m( V( `/ u* S6 T3 h
我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!
$ F; M$ n- j% v u3 v9 g; k. t! w* j9 G5 j6 {2 C* x
如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^
# H& I4 O. O5 l+ c) q9 p+ i
2 c% i' f/ d7 d$ w 如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:+ ?, ?5 h! i! R% X+ k A
○■○
8 [% Y3 M5 E6 N( z6 Y○○■$ j$ a" k! j' Y/ i% F' Y- O
○■○
& t4 i0 J3 |9 {0 G% h& {2 T$ d■○○4 S' @: g1 P. _6 \
■■■
1 X8 K' ]* G6 P, }8 m+ k! n m( D8 T 那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。2 S- `/ {1 E5 R# f" p- V: |
. }8 ]& F4 L9 z5 j! h# K0 i
寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。
! A; p) n. } a# v9 j5 m, B 再舉一個例子:: P( N! p7 P# Q* \3 n# ^0 V
○■○& M. p3 W6 t, K% O& v
■○○2 y( V1 c0 q4 s: K& E) r9 s
■■■+ L1 |% |* m7 M9 B( Q% y
■○■& ~& f J W- w+ S8 O3 N7 _2 B
○■○
/ N& \. M' o+ D9 J9 z6 L6 j 這是哪個數字呢??是6,沒錯& K6 G6 m- @8 W! t, e) [
. Y% |6 R) l( s1 [. Q 我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。1 T Y. j" @ [7 {6 P
/ H9 M1 v& s. J 另外你取的百分比也需要注意,不能太大也不能太小。2 @/ b% V5 U: E- f, Y* i
' D& [, i, t, \: A. E! K6 X" O( l' H+ J
好了,等做好自己的數據庫,這時就可以識別大部分數字了。! z2 s8 o/ |! V9 H' X" x, G& o( Z
. u8 ^, T" R1 I; B; c! T2 P0 e
最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖:
; j) ~& J; e, ~3 z/ r& q: L■■■* X: g% x0 j* V
■○○
u Z& d: d# }1 H+ i }■■■
5 r- ] C9 s- B+ M■○■. P) T: h8 S1 j3 c2 M: J
■■■
+ P7 S z% |! I+ K- ~2 ` 在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?
; y) d+ i& R+ \( z8 U- v. }; J1 d( K6 B( n2 u2 U" ~1 f
我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。
s; ?5 Y* ^; B8 ^# V2 J4 h7 E
遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:
/ z ?8 V0 a" y0 t- X F) d■■○: ?. {" k; T; e* d3 K) }7 Y0 I
■○○* ^: F. ?* M2 ~; E7 \# h3 V( \- Z
■■○' p7 S z! R8 Q5 [
○○■* p7 T+ I4 w5 e. X
■■○ g; i* L! A3 i( D; ~
OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。 |
|