当前位置:
首页 > 编程开发 > Objective-C编程 >
-
163相册验证码图片的识别手记—识别
制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
识别验证码一般是要经过“去干扰”,“切字”,“识别”三步处理。
一、切字:
切字即是将图片里的每个验证码都分别“切”开,这样才能进行下一步的验证码识别,并且“切字”切出来的“字”顺序也关系到识别出来的字符顺序,比如以下验证码样例图片:
则应该需要切出“7”,“4”,“3”,“7”,“7”五个字图。
对于不同的验证码图片,“切字”的方法也不尽相同,如对于一些验证码出现位置固定的验证码图片则可以直接从图形中分析出字坐标,再进行“切字”即可。而对于一些采用了“变位”干扰的验证码图片(如163相册的)就不能采用固定坐标来“切字”了,并且对于某些字符相连的验证码图片(如Google的),“切字”比“去干扰”还更头痛!!(-_#碰到这类的验证码图片,我一般放弃。咔咔!)
对163相册验证码图片进行“切字”其时还是很简单,因为验证码字符之间是没有任何相连,只是采用了“变位”干扰,但对于这种图形使用“去白拆分法”(嘿嘿,这方法名是我自己名的命)则基本是万能方法。
去白拆分法:
也就是先将空白的头尾行/列去掉,再按空白列拆分为多个子图,再将这几个子图的头尾空白行/列去掉,经过这几步处理后,那些拆分出来的子图就是最终“切”出来的验证码字图了。
1,去白:去除验证码图片的头尾空白行/列
比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):
图片看不清楚?请点击这里查看原图(大图)。
去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。
图片看不清楚?请点击这里查看原图(大图)。
经过“去白”处理后,图形就变成了如下样式:
图片看不清楚?请点击这里查看原图(大图)。
2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:
图片看不清楚?请点击这里查看原图(大图)。
但要注意,经过上面折分后字图里也还是包含有空白的头尾行,所以也要“去白”处理,如下图:(也就是将那些黄色区域去掉)
图片看不清楚?请点击这里查看原图(大图)。
经这样处理后的“字图”就可以用于识别了:)
注意:对于某些被干扰破坏得很严重的图形,在进行“去白拆分”操作时要确保“切”到的字图高宽度为“源数字图”的大小。
如下图中的“5”字:
图片看不清楚?请点击这里查看原图(大图)。
二、验证码识别:
当经过“去干扰”,“切字”处理后,识别就是一个很轻松的工作了。一般采用图形结构“相似度比较法”进行识别,这样对于一些在“去干扰”时就破坏了结构的字图(如上面图片中最后二个“7”字)也可以识别出来,但也因为是对图形结构进行“相似”比较,所以就存在有识别失败的可能性。
相似度比较法:
此方法是将每个“切”出来的字图和所有源数字图逐一比较,并得出一个图形结构的相似度值,然后再取相似度值最高的“源数字图”,这样“字图”对应的字符就识别出来了。
图形结构相似度:
假如将一幅图看成一个二维数组(一维下标对应X轴,二维下标对应Y轴),数组里的数据就是每个象素点的颜色值。那么求两副图图形结构的相似度值,则是等价于求两个二维数组里的数据的相似度统计。
假如有两个数组的数据分别如下:
二维数组A里的数据:("4"字的01图)
00000110
00001110
00011110
00110110
01100110
11000110
11111111
00000110
00000110
00000110
二维数组B里的数据:("4"字被干扰破坏后的01图,注意红色部分)
00000110
00001110
00011110
00110110
01100110
11000110
11100111
00000010
00000110
00000110
求A与B的相似度,则分别比较AB对应“行”里的数据,找出不相同点的数量,也就是共有3次不相同,所以相似度值大概为96% ,因此就可以认为B是A了。
注:对于相似度取什么值就可考虑AB“相等”,这个大家要权衡一下,毕竟取的值过低识差率可是很大的。
声明: 此文章只是记录我在处理163相册验证码图片识别过程时的想法思路,在此发表只是纯粹基于技术探讨目的.因此在文章中不会提供任何源码下载!!任何人利用这里介绍的方法所做任何事情而出现的责任本人概不负责!!如果需要转载此文,请注明原作者和出处!!
1,去白:去除验证码图片的头尾空白行/列
比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):
图片看不清楚?请点击这里查看原图(大图)。
去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。
图片看不清楚?请点击这里查看原图(大图)。
经过“去白”处理后,图形就变成了如下样式:
图片看不清楚?请点击这里查看原图(大图)。
2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:
识别验证码一般是要经过“去干扰”,“切字”,“识别”三步处理。
一、切字:
切字即是将图片里的每个验证码都分别“切”开,这样才能进行下一步的验证码识别,并且“切字”切出来的“字”顺序也关系到识别出来的字符顺序,比如以下验证码样例图片:
则应该需要切出“7”,“4”,“3”,“7”,“7”五个字图。
对于不同的验证码图片,“切字”的方法也不尽相同,如对于一些验证码出现位置固定的验证码图片则可以直接从图形中分析出字坐标,再进行“切字”即可。而对于一些采用了“变位”干扰的验证码图片(如163相册的)就不能采用固定坐标来“切字”了,并且对于某些字符相连的验证码图片(如Google的),“切字”比“去干扰”还更头痛!!(-_#碰到这类的验证码图片,我一般放弃。咔咔!)
对163相册验证码图片进行“切字”其时还是很简单,因为验证码字符之间是没有任何相连,只是采用了“变位”干扰,但对于这种图形使用“去白拆分法”(嘿嘿,这方法名是我自己名的命)则基本是万能方法。
去白拆分法:
也就是先将空白的头尾行/列去掉,再按空白列拆分为多个子图,再将这几个子图的头尾空白行/列去掉,经过这几步处理后,那些拆分出来的子图就是最终“切”出来的验证码字图了。
1,去白:去除验证码图片的头尾空白行/列
比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):
图片看不清楚?请点击这里查看原图(大图)。
去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。
图片看不清楚?请点击这里查看原图(大图)。
经过“去白”处理后,图形就变成了如下样式:
图片看不清楚?请点击这里查看原图(大图)。
2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:
图片看不清楚?请点击这里查看原图(大图)。
但要注意,经过上面折分后字图里也还是包含有空白的头尾行,所以也要“去白”处理,如下图:(也就是将那些黄色区域去掉)
图片看不清楚?请点击这里查看原图(大图)。
经这样处理后的“字图”就可以用于识别了:)
注意:对于某些被干扰破坏得很严重的图形,在进行“去白拆分”操作时要确保“切”到的字图高宽度为“源数字图”的大小。
如下图中的“5”字:
图片看不清楚?请点击这里查看原图(大图)。
二、验证码识别:
当经过“去干扰”,“切字”处理后,识别就是一个很轻松的工作了。一般采用图形结构“相似度比较法”进行识别,这样对于一些在“去干扰”时就破坏了结构的字图(如上面图片中最后二个“7”字)也可以识别出来,但也因为是对图形结构进行“相似”比较,所以就存在有识别失败的可能性。
相似度比较法:
此方法是将每个“切”出来的字图和所有源数字图逐一比较,并得出一个图形结构的相似度值,然后再取相似度值最高的“源数字图”,这样“字图”对应的字符就识别出来了。
图形结构相似度:
假如将一幅图看成一个二维数组(一维下标对应X轴,二维下标对应Y轴),数组里的数据就是每个象素点的颜色值。那么求两副图图形结构的相似度值,则是等价于求两个二维数组里的数据的相似度统计。
假如有两个数组的数据分别如下:
二维数组A里的数据:("4"字的01图)
00000110
00001110
00011110
00110110
01100110
11000110
11111111
00000110
00000110
00000110
二维数组B里的数据:("4"字被干扰破坏后的01图,注意红色部分)
00000110
00001110
00011110
00110110
01100110
11000110
11100111
00000010
00000110
00000110
求A与B的相似度,则分别比较AB对应“行”里的数据,找出不相同点的数量,也就是共有3次不相同,所以相似度值大概为96% ,因此就可以认为B是A了。
注:对于相似度取什么值就可考虑AB“相等”,这个大家要权衡一下,毕竟取的值过低识差率可是很大的。
声明: 此文章只是记录我在处理163相册验证码图片识别过程时的想法思路,在此发表只是纯粹基于技术探讨目的.因此在文章中不会提供任何源码下载!!任何人利用这里介绍的方法所做任何事情而出现的责任本人概不负责!!如果需要转载此文,请注明原作者和出处!!
1,去白:去除验证码图片的头尾空白行/列
比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):
图片看不清楚?请点击这里查看原图(大图)。
去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。
图片看不清楚?请点击这里查看原图(大图)。
经过“去白”处理后,图形就变成了如下样式:
图片看不清楚?请点击这里查看原图(大图)。
2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数