focalism / sina_code_distinguish

python 新浪模拟登陆验证码识别

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

sina_code_distinguish

python 新浪模拟登陆验证码识别

验证码识别的一般思路为:

1、图片降噪

2、图片切割

3、图像文本输出

1.图片降噪,文件show.gif是:http://weibo.cn/search/?tf=5_012&vt=4,保存的最原始的验证码,降噪主要包括

1.1去除干扰线:干扰线的像素值(4,2,4)都一样,且与字符的像素值不一样,所以只要将干扰线的像素值(4,2,4)转为白色(255,255,255)就行

1.2去掉离散干扰点:参考过http://www.programgo.com/article/84313451055/的方法,但是这里的字符是空心的,这种方法会把字符的像素点去掉,所以没有采用。因为验证码干扰点不是很多,所以不会造成很大影响。

1.3二值化:即进行灰度化处理,根据阀值将灰度图二值化,变成黑白图片

2.图片切割,sina验证码的切割是本验证码的难点,因为不像其他的验证码,每一个字符都是固定长度,只要设定长度,就可以将每个字符切割出来,sina的验证码,每个字符所占的长度是不一致的,这样就不能用固定长度进行切割,所以采用了另外一种切割方式:

如文件show.png所示,将验证码(应该是去噪之后的验证码)按列网格化,统计每个网格点内的像素点:

[ 0. 0. 4. 10. 3. 7. 7. 4. 5. 6. 7. 6. 0. 0. 0…0. 0. 5. 5. 6. 2. 5. 9. 4. 5. 8. 3. 2. 0. 0. 0. 0. 0. 0. 8. 7. 2. 9. 6. 7. 8. 6. 7. 7. 2. 0. 0. 1. 5. 5. 7. 11. 10. 9. 5. 3. 3. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

虽然每个字符所占的网格点一样,但是每个字符所占的像素点至少有一个,如:

[0. 0. 4. 10. 3. 7. 7. 4. 5. 6. 7. 6. 0. 0],

即为一个字符所占的网格点,同时,字符与字符之间的为空白像素点为0,这样就可以把验证码切割出来。

3图像文本输出:

3.1建立字符库:从http://weibo.cn/search/?tf=5_012&vt=4上保存100张验证码,然后将其分割,建立字符库model。

3.2建立字符字典:人工识别字符库里面的字符,并保存到model.txt,如:
h.gif h

y.gif y

3-1.gif 3

5_1_new.gif 3

6_1_new.gif c

6_2_new.gif j

6_3_new.gif m

7_1_new.gif w

7_2_new.gif l

8_1_new.gif n

8_2_new.gif x

...

3.3互相关,识别字符:切割待识别的验证码,将切割出来的验证码与model里面的字符集做互相关计算,找出相关系数最大的字符,并在model.txt里面找到对应的字符。

About

python 新浪模拟登陆验证码识别


Languages

Language:Python 100.0%