发新话题
打印

验证码识别技术

验证码识别技术

由于现在很多网站,为了加强安全性,以及防止程序的自动操作网站,都加入的了验证码技术。但却给广大站长推广宣传网站带来的麻烦。所以我准备写这篇关于验证码识别技术的文章,不足之处在所难免!本人从来不写东西,今天为了想落伍才写了!
1 X! W  }% K+ ^; t9 B- Y* D6 k* e
& w$ w1 [3 Z" ~1 U8 z; b+ @( F     广大站长宣传推广自己的网站,经常要发布一些宣传广告,如果靠人工,太慢太昂贵,所以理想的办法是使用群发软件,可现在很多网站都有验证码,这成为群发软件的技术难点,而识别也就难点中的难点,好的,闲话少说,言归正传!
( U  F! W: E. L% R% O
; A- m/ p; e2 T0 y; r    我举的例子是比较难于识别的验证码,不讨论不变形、不换字体、不换大小、不旋转的验证码,这里我可能不会写出代码,只是提供我编写的思路,按照这个思路,我写出的程序,比市场上出售的程序的识别率还要高很多。(有兴趣的可以问我,我不想在这里帮别人宣传,呵呵~~)! P2 s; ]6 i0 V! b; [
# E) d, m4 X5 l  a! _
    首先以数字验证码开始,字母的要比数字麻烦一些,不过搞清楚了数字验证码的识别,字母的也就不难了。$ K6 }# b! P2 I1 @6 _2 S
4 {9 [* h; m5 W5 W; a1 l
    验证码一般都是图片,而且一般都是4位数,处理过程是:先分割为4个部分,然后逐一识别,由于分割比较简单,我这里就不说了,我这里只说如何识别。6 u9 o6 R- Q1 l* b% _

% U' [3 V9 U7 u" i6 k8 Q    我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,为什么要划分为15个块呢?先看图!
4 b/ F, ~' X3 k) B, R○■○ 6 c$ D6 j- X: X7 S( F% Q0 v# F
■○■
3 \' ^8 `: x- L. i" R■○■. f3 R4 X9 n4 z
■○■
- c& L9 X" x) _# ]) e  l/ o○■○
8 e5 c7 i, f9 x9 H3 f5 ^$ B; F5 w) N& M$ i0 j& U4 w- j
○■○
# z) W% q1 V  \* k8 Q+ L6 \■■○* F, Z) _5 x# ?" N
○■○
! z/ N" Y# {. e5 \6 u& M" l7 m" E○■○( `0 G; @/ _( q
■■■0 k; V7 s8 ~( |( L0 t! U

  z" K1 d$ q3 \: u■■■4 h0 U: E  e" x" k6 @3 T. D3 B( q
○○■3 p% K0 U; @& J" a! |
■■■# J7 T' Y  @8 M5 q0 |; P8 K3 T( d
■○○" P0 g2 i4 M- @: k
■■■6 [* \5 y3 L  M" r7 U
$ G; g5 e  i% V/ x8 `1 l5 S
■■■
. x6 G! f# S1 \- A! [○○■  k8 T3 D. v8 A2 Z* T5 c
■■■- K$ a# q3 B4 P& T2 B+ D( m* _
○○■# k2 x: Y: U' ~3 u# m
■■■- z9 i, \- B' a) L- c
我先举这4个例子吧,其余的大家可以自己画出来。如果做过验证码识别的朋友,肯定很快就明白为什么划分为15个块,其实主要就是因为这样划分更合理,也就更能提高识别率。
) C& E& N" k9 F5 |" g8 a
5 @  y) N- T; s# K, Y    我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,然后对每个块进行计算,当每个块里的有效象素超过多少百分比的时候,就标记为 ■,如果没超过就标记为○,(这里为了显示方便我使用了■,○,你完全可以把它标为1、0),这里要注意一下,这里的百分比根据字体的粗细可以取 67%,50%,33%,20%,为什么要取这几个数?主要和计算机的浮点数运算有关,选这几个数,运算更快,且不容易出错,否则计算机在进行大量计算时也是会出错的!当然这里,你完全可以选适合你的验证码图片的百分比!!
( d9 B0 H( F  e/ X( S
6 ]4 q+ j% a( s4 j8 ]    如果验证码不变形、不换字体、不换大小、不旋转,我们的识别工作到这一步基本上就结束了,因为已经可以得到比较清晰的块图,对付大多数论坛,就已经足够了。^_^/ P* |% V- e" U5 w5 l

& l. x. U) y. t4 P/ {   如果验证码的变形比较大、且有很多字体、大小也不固定、且有旋转,那么我们经过划分、取比率显示后,可能会得到这样一个图:' N, ]; Q1 ?7 x; ?  Q% ]
○■○
" U( U2 p" q+ Q1 _! A1 o○○■
  f- ~6 x1 }1 E: k6 J& a○■○( w; a. ~% l8 o2 j5 S
■○○* G& @* p! H, K1 I, Y
■■■( _  R' ~  W+ Q# }8 S
    那么这个数字应该是什么数字,我们需要使用排除法!排除所有不可能,在0123456789中,这个图不可能是013456789,他只能是 :2。
6 V) S2 M3 E/ P3 k9 H
$ b3 |& |2 e1 a; U. m2 `9 |    写过验证码识别的朋友可能已经明白了!是的,我们需要建立一个类似的数据库,也就是识别库,出现哪些图,他就属于那个数字。9 A+ W' [8 K6 p3 G0 S
   再举一个例子:
0 U) [, n" H3 v1 h3 T6 }3 t* o# X○■○
; M- k& V1 U9 j, j- Y■○○
3 e. j2 w$ V% o; m■■■
% G% q# c2 |- o/ m) x+ l■○■7 n" f8 v6 a2 m- q' n
○■○9 T, q& X' M+ e) F7 i: W
     这是哪个数字呢??是6,没错- P" D' \& p; k7 P  v' h

* ~; q6 u" b, B% d# c2 _. }! G+ I( Z     我这里我需要再说明一下为什么要取5行,3列,15个块,因为块太多了你 的识别库就会很大,块太少了,就会出现很多分不清楚的块图。
& G* _0 u( i; Z( G  D2 s2 F6 J
7 X9 p8 ]9 ?) v; l4 }. B    另外你取的百分比也需要注意,不能太大也不能太小。$ k2 r, H! N9 b6 @. _
: N6 C$ y8 |* m8 R% b' m
     好了,等做好自己的数据库,这时就可以识别大部分数字了。: ^1 I8 ?6 J% F( n* J& `

' P; H% p: D: g, R1 p0 d. p3 h+ h- I# J    最后还有一个问题,就是重复的问题,比如,图片上的数字,明明是 5,可由于它的字体不是常见的字体,且发生了旋转,最后得到这样一个图:0 H2 b/ G/ v. `2 ~; u: R7 r
■■■6 k* A6 [$ K7 z* i! v7 @
■○○1 o( j8 ?, _' d1 @. H6 Y! z
■■■! e, d2 K+ d2 @0 ~% h% e
■○■. k' Q; O2 ~& e5 U8 S5 r% N
■■■: i) u1 F1 o0 W* n# G! I4 V
   在我的数据库里,这个块图,是6,也是就说识别错误,怎么办?) [, j+ C, G, s! C

" I9 J# n' f5 j' W( }    我的解决方法是,在数据库里先把这条数据删除因为这个是错误的。4 c  t' t7 @' u# }- ~, R3 Q
$ O1 r: P/ Z  X# s5 q. F0 s
    遇到这种情况,就需要进行二次处理,我的方法是:降低百分比,这时就得到了:
# B, M, P& g( u' C& ?■■○' i1 k4 t; i& a; [4 f, c
■○○
7 D/ Z- H$ ^: |& S■■○4 D5 _" p0 v  O- g6 g# P. s! E3 S
○○■+ D$ P, j  |' v+ J8 z+ I
■■○. c5 g$ W7 o3 x
     OK,经过降低百分比,图片就由“6”又变为“5”了,呵呵~~~由于降低了百分比,我们需要再建立一个识别库的来存储这些数据。
6 g+ ~5 ~( _- K; n( b3 w/ O3 [9 q+ w
' [8 P; U7 f% N
: K! m' i0 n& K1 z  Z. K    好了,我的文章就写到这里,只是给大家提供一个思路,可能还有一些细节我没写出来,但主要的方法都提供出来了,希望能起到抛砖引玉的作用!!!!

想要访谈的站长请联系我Q:893819301

TOP

不错,很经典,就是不知道怎么写
www.beiweb.cn,最具性价比空间,高速,稳定--北纬 QQ:539382884

TOP

:30: :30:     看得不是很明白
http://bbs.190eb.com/index.php

TOP

发新话题