过期域名预定抢注

用戶名  找回密碼
 免费注册

驗證碼識別技術

[複製鏈接]
發表於 2007-12-10 16:15:54 | 顯示全部樓層 |閱讀模式
由於現在很多網站,為了加強安全性,以及防止程序的自動操作網站,都加入的了驗證碼技術。但卻給廣大站長推廣宣傳網站帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!: r& C3 K% Y" {9 {% a3 B
' U1 E7 p: `. p1 M4 k, c. n  g; A
     廣大站長宣傳推廣自己的網站,經常要發佈一些宣傳廣告,如果人工,太慢太昂貴,所以理想的辦法是使用群發軟件,可現在很多網站都有驗證碼,這成為群發軟件的技術難點,而識別也就難點中的難點,好的,閒話少說,言歸正傳!
' Y' i6 d7 [" S
8 W3 f/ e2 T) o    我舉的例子是比較難於識別的驗證碼,不討論不變形、不換字體、不換大小、不旋轉的驗證碼,這裡我可能不會寫出代碼,只是提供我編寫的思路,按照這個思路,我寫出的程序,比市場上出售的程序的識別率還要高很多。(有興趣的可以問我,我不想在這裡幫別人宣傳,呵呵~~)5 K8 u3 V  q! F3 N/ O+ D$ ^( N

' X% y' h0 u5 N: W7 M7 O    首先以數字驗證碼開始,字母的要比數字麻煩一些,不過搞清楚了數字驗證碼的識別,字母的也就不難了。
% G6 P# _; S# _8 Z
- Q* C3 h, D: k    驗證碼一般都是圖片,而且一般都是4位數,處理過程是:先分割為4個部分,然後逐一識別,由於分割比較簡單,我這裡就不說了,我這裡只說如何識別。
8 g4 P! ^2 p+ }3 d$ @3 Z& A1 \3 X4 O+ a+ c
    我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,為什麼要劃分為15個塊呢?先看圖!
( ]& m0 W* K3 h: q- [6 i) Z○■○ 0 S/ m/ Z0 k  e! `- \
■○■) [. e) K, ^7 j+ @8 B' H- ~" F
■○■7 P7 X$ `  A0 D% I: g, w4 t
■○■
1 m* `$ H. C; j# T○■○
+ |8 q% ?, \1 I7 z5 c  \& H% L9 P6 n5 n
○■○
( y! Y3 X2 n9 r% m3 ?' i■■○
# S$ d. w# i! b' C, r0 V; v○■○
( A' S9 C9 a: A5 f○■○
* x, T! E! F8 {- D  e4 x5 l■■■. v7 W! Q3 E* x; L: P, Y. b8 `1 r

! S" {  s& i2 U' }■■■, M: J8 X* O" M% I
○○■- m# Q$ f+ F# R& s! `
■■■) c- y2 P6 M" M) W. W
■○○
6 ~+ E3 e5 w, y( F■■■
6 D2 \5 G9 L% a( }( E1 q: |3 g0 i8 ?3 t1 w& P, u( T
■■■- V) ~" [# \, C/ T5 a. H/ i$ Z. a
○○■3 z9 H9 {, z& [4 \' I3 D2 X
■■■
( r2 `) L. J( H. j○○■, A# O* L) B+ u# V0 J
■■■
2 G1 M4 y3 ~7 r( r我先舉這4個例子吧,其餘的大家可以自己畫出來。如果做過驗證碼識別的朋友,肯定很快就明白為什麼劃分為15個塊,其實主要就是因為這樣劃分更合理,也就更能提高識別率。
, g4 J/ j0 A, s; _: I8 J2 L) J8 r0 i
    我的方法是把需要識別的圖片,劃分為 5 行,3 列,15個塊,然後對每個塊進行計算,當每個塊裡的有效象素超過多少百分比的時候,就標記為 ■,如果沒超過就標記為○,(這裡為了顯示方便我使用了■,○,你完全可以把它標為1、0),這裡要注意一下,這裡的百分比根據字體的粗細可以取 67%,50%,33%,20%,為什麼要取這幾個數?主要和計算機的浮點數運算有關,選這幾個數,運算更快,且不容易出錯,否則計算機在進行大量計算時也是會出錯的!當然這裡,你完全可以選適合你的驗證碼圖片的百分比!!
) k. ~7 J7 |; d8 N9 z
6 D$ o. p1 E, }/ m/ v: u    如果驗證碼不變形、不換字體、不換大小、不旋轉,我們的識別工作到這一步基本上就結束了,因為已經可以得到比較清晰的塊圖,對付大多數論壇,就已經足夠了。^_^7 i0 j& ?! K. ]2 T; Y  k

- s3 P) q7 v+ m$ ~5 O' A1 J   如果驗證碼的變形比較大、且有很多字體、大小也不固定、且有旋轉,那麼我們經過劃分、取比率顯示後,可能會得到這樣一個圖:, g( a8 B# {+ R: w
○■○
# r: g' {5 F/ \2 V* G○○■0 {- ?8 W# P: T& G3 K6 h
○■○+ y3 e/ \4 e$ D
■○○
# K/ Z$ z9 f0 {- N# D7 ^■■■
1 y- j) G- v! v% S* x% _    那麼這個數字應該是什麼數字,我們需要使用排除法!排除所有不可能,在0123456789中,這個圖不可能是013456789,他只能是 :2。1 ~9 C4 L% P! K) t/ K

' h) V; v2 k; N# J6 l$ H7 V    寫過驗證碼識別的朋友可能已經明白了!是的,我們需要建立一個類似的數據庫,也就是識別庫,出現哪些圖,他就屬於那個數字。/ |: J# |+ z! ]7 z& ~- t
   再舉一個例子:
7 u! O4 H2 [. t1 l& D- d○■○
' h( m$ }5 Y% A: C■○○. d' |* s1 P6 c; G
■■■
( a3 D8 R! N# H! u: s4 C■○■6 N/ |; r& X/ y8 K. [
○■○
, V- m3 }2 V. w2 }1 B     這是哪個數字呢??是6,沒錯
  T3 N  t  U8 p& {' k
" V; t# s$ T9 w, d     我這裡我需要再說明一下為什麼要取5行,3列,15個塊,因為塊太多了你 的識別庫就會很大,塊太少了,就會出現很多分不清楚的塊圖。
, Y$ ^  \% M6 |  t
) d3 P- D" f% S  v2 Z, j' Z    另外你取的百分比也需要注意,不能太大也不能太小。
/ l) Q( L* |( e  ~- b7 O5 ^
9 R" j+ j  p+ H6 ^: f     好了,等做好自己的數據庫,這時就可以識別大部分數字了。7 a" U; o! N" [# |7 v' Z* F+ I1 f' B

4 g' E7 Z6 R2 C; Q; Z0 C    最後還有一個問題,就是重複的問題,比如,圖片上的數字,明明是 5,可由於它的字體不是常見的字體,且發生了旋轉,最後得到這樣一個圖:
8 _$ I" v/ p5 D% p( s1 v2 D■■■, e4 }1 [9 f1 a& J6 U# a
■○○
) N0 R0 q# M4 P6 M/ F■■■/ A' }- i1 s3 W
■○■
3 w( l2 B8 x$ u! v5 B, ^/ J, {* ?  ~■■■# F9 K4 P* Z1 l+ d
   在我的數據庫裡,這個塊圖,是6,也是就說識別錯誤,怎麼辦?
# z+ X# t& E3 S. C* l* r2 ?1 C4 `4 Y% L
    我的解決方法是,在數據庫裡先把這條數據刪除因為這個是錯誤的。
% u* a0 G5 s: M) A6 M  \* L$ v7 }0 |$ Q0 {
    遇到這種情況,就需要進行二次處理,我的方法是:降低百分比,這時就得到了:; q' W5 }# i: t; b5 k, e. Z. i
■■○
5 G& U+ o5 d9 Z2 B9 k* u: O6 V■○○
7 E" p' z* k% x/ S2 f  @+ }■■○
: N% U; d/ \( @. q. V- ]○○■8 c: @" r9 d+ F0 f
■■○7 N1 c& y: m+ Y; r% l, b
     OK,經過降低百分比,圖片就由「6」又變為「5」了,呵呵~~~由於降低了百分比,我們需要再建立一個識別庫的來存儲這些數據。
發表於 2007-12-10 16:25:19 | 顯示全部樓層
呵呵  學習了
回復 给力 爆菊

舉報

發表於 2007-12-14 10:32:54 | 顯示全部樓層
: 不明白,不過學習了...
回復 给力 爆菊

舉報

發表於 2008-1-6 15:33:26 | 顯示全部樓層
學習:
回復 给力 爆菊

舉報

發表於 2008-1-6 15:57:26 | 顯示全部樓層
不明白誒
回復 给力 爆菊

舉報

發表於 2008-1-7 19:53:47 | 顯示全部樓層
寫的很不錯的.
回復 给力 爆菊

舉報

發表於 2008-1-7 20:05:05 | 顯示全部樓層
驗證碼識別技術
) U% W& m9 t- k- H* m做驗證的最後一道門檻了
回復 给力 爆菊

舉報

您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

點基跨境 數位編輯創業論壇

GMT+8, 2025-6-18 18:44

By DZ X3.5

小黑屋

快速回復 返回頂部 返回列表