‘壹’ 手机验证码的原理是什么
验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。像网络贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。 一般注册用户ID的地方以及各大论坛都要要输入验证码
‘贰’ 验证码识别之模板匹配方法
在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:
- 图像灰度化
- 图像去噪(如图像二值化)
- 切割图片
- 提取特征
- 训练
但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符 。
本文要介绍的算法 不需要进行图片切割,也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板。
这篇文章将分为两个部分:
第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;
第二部分是一个具体实例。
模板匹配是在图像中寻找目标的方法之一,目的就是在一幅图像中寻找和模板图像最相似的区域。
模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。
假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:
从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
用某种方法得出临时图像与模板的相似度c,存放到相似度矩阵中(矩阵大小为91 x91);
切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到相似度矩阵;
重复上述步骤,直到输入图像的右下角。
最终得到一个相似度矩阵,找到矩阵中的最大或最小值,最大值(最小值)对应的临时图像即为与模板最相似的图像。
在步骤b中,求模板与图像的相似度有多种方法,如平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、归一化互相关算法(NCC),本文使用的是归一化互相关算法。
什么是归一化互相关?
从几何图形上来看,空间中的两个向量,同方向平行时,归一化互相关系数为1,表示两个向量最相似,反方向平行时归一化互相关系数为-1,垂直时为0,表示最不相似(用互相垂直的三个向量来代表整个空间也是这个道理,垂直的向量之间不包含对方的信息,相关系数为0),存在一定夹角时处于(-1,1),是不是跟余弦函数很像,cos(0)=1,cos(pi/2)=0,cos(pi)=-1。就是这个样子的,相关系数可以看作是两个向量之间夹角的cosine函数。
在数学中是这么计算cosine函数的,假设两个n维向量X,Y,对应的坐标分别为(x1,x2,…xn), (y1,y2,…yn) 则:
(如果想要了解更多,请参考文献【2】)
但这是一维的,在模板匹配中要再加一个维度 (具体算法请参考文献【3】) ,简要说一下文献【3】的内容:如果直接计算二维相似度的话计算复杂度会非常高,文献【3】利用快速傅里叶变换与积分图像快速算法来降低计算复杂度。
接下来让我们看一个具体的应用。
模板匹配识别验证码的具体步骤为:
1. 找出图片中所有可能出现的字符,制作成模板集合
2. 图像灰度化
3. 图片去噪(二值化)
4. 模板匹配
5. 匹配结果优化
要识别的图片如下,以识别图片中的加字为例:
要从image中找到与模板最匹配的部分,Template图像是事先从image图像中截取的一部分。所用的为python模块skimage中的match_template方法,match_template方法使用的是快速归一化互相关算法 【2】 。
遍历模板图像集合,与图像匹配,如果dist大于阈值h,则认为此模板在图像中存在,否则不存在,继续匹配下一个模板,直到遍历完所有模板。
以模板‘加’为例,图像大小为40x260,模板大小27x27,result是一个大小为(14,234)的矩阵,即上文提到的相似度矩阵,矩阵中的数值属于[-1,1],找到result中最大值所处的对应位置即为与模板最匹配的图像位置:x=66,y=11,正好对应模板图像在image中所处的位置。 (更多内容请参阅参考文献【4】)
但这是比较好的情况,因为在匹配时遍历了所有的模板,而一张图片中出现的模板数量是有限的,比如数字’四’在图片中是没有的,这时就要根据某种规则去掉这些在图片中没有出现的模板:程序中使用dist变量来过滤匹配结果,如果dist变量大于某个值则认为此模板在图像中不存在。
最后的result_list中可能仍然存在一些图片中不存在的模板或者匹配不精确的模板,比如数字‘一’在模板中不存在,但仍然可以匹配到,因为数字‘二’中可以匹配到‘一’,需要进一步优化,优化方法有很多,比如当匹配到的两个模板距离过近时,选择较大的那个模板,其余方法留给读者自行考虑吧。
后续将会推出如何使用深度学习识别验证码,敬请期待~
参考文献:
http://www.cnblogs.com/beer/p/5672678.html
http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
J. P. Lewis, “Fast Normalized Cross-Correlation”, Instrial Light and Magic.
http://scikit-image.org/docsjinhqin/dev/auto_examples/plot_template.html
本文作者 :李晖(点融黑帮),毕业于电子科技大学,现就职于点融成都Data部门,对一切新鲜事物充满好奇,对跳舞毫无抵抗力的活力女青年一枚。
‘叁’ 身份证号最后一位数字称之为校验码,校验码的计算方式是怎样的
按照相关规定,身份号是由17个数字和1个数字校验码组成的。而最后一位校验码,就是检查身份证是否正确的主要依据。它的计算方法,主要是由前17位乘以不同的系数,最后的总和除以11。在这种情况下,得到的余数,就是校验码。
那么我们在反推的时候,就可以用身份证号乘于系数,当最后得出的余数和末尾校验码不同时,就代表这个身份证,是一个假的身份证,不符合我们国家的标准。另外,余数对应的数字不同,并不是说余数就一定是最后一位身份证号码。
看到整个计算过程,我们会发现,想要得出校验码,并非一件易事。不过在计算中,有人可能会提出疑问,最终的除以为什么是取11,而不是其他数字。
其实这个问题的答案很简单,结合校验码的功能,11是最容易检测出问题的存在。同时,它可以覆盖到大多数身份证,方便进行校验。毕竟一个国家人口众多,校验码要做到尽可能覆盖所有人。
‘肆’ 验证码技术如何区分人类和计算机
在CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答 CAPTCHA 的问题,所以回答出问题的用户就可以被认为是人类。 CAPTCHA 是由计算机来考人类,而不是标准图灵测试中那样由人类来考计算机,因此人们有时称 CAPTCHA 是一种反向图灵测试。 一则有关验证码的笑话 验证码是否真的保护了计算机系统 yixieshi.com 一队来自斯坦福大学的研究人员指出很多验证码完全没有发挥应有的作用。这些研究人员甚至设计了一个通用程序,这个程序能够以极高的成功率识别出许多网站上的验证码,包括 Visa 旗下网站 Authorize.net ,暴雪官方网站, eBay ,以及维基网络。 这种识别技术用到了机器人视觉领域的一种概念模型,它有助于机器人不受图像噪点的干扰正确识别物体的外形。斯坦福这个名为 Decaptcha 的工具使用上述指导思想编写的算法能够将扭曲变形且充满噪点的图片分割成可以通过光学识别技术( OCR )辨别的字母和数字。 ”大多数验证码投入使用之前都没有经过必需的验证,也缺少可靠性测试。“ 来自斯坦福大学安全实验室的研究人员 Elie Bursztein 博士后说:”我希望我们的研究能够让人们更为慎重的对待验证码的设计和使用。“ 互联网的一些事 Decaptcha 能够成功识别 66% Visa 支付网站 Authorize.net 上的验证码图片,并可以顺利攻陷暴雪娱乐网站上 70% 的验证码。而维基网络有四分之一的验证码可以辨识,在 CNET 以及 Digg.com 上这个数字降低到了五分之一。来自斯坦福的这个研究团队随后指出,任何可辨识率超过 1% 的验证码系统都不应该被继续使用下去。 各大网站的验证码识别率: 随后暴雪发表声明说,他们明确的知道验证码技术并不具有足够高的安全性。”我们仅在初级安全层使用验证码技术抵挡一些特定的攻击,比如注册环节。我们使用一些更为安全可靠的技术来保护我们的客户与骨干服务器。“来自暴雪的 Shon Damron 这么说。 如今的验证码 验证码技术在目前的网络世界中仍然十分重要,它有助于阻止自动机器人批量注册网络邮箱并发送垃圾邮件,还能防止留言板被自动程序填塞广告,甚至使投票系统更能反映真实情况。 各大网站所使用的验证码范例: 新浪微博所使用的中文验证码范例——似乎没有考虑到国际化的情形: yixieshi.com 到目前为止,只有 Google 的验证码完全阻挡了 Decaptcha 的辨识, Google 在 2009 年从卡耐基梅隆大学收购的 ReCaptcha 项目也表现出了极其高的可靠性。目前 ReCaptcha 已经被广泛地使用在了近 10 万网站上,这些网站包括 Twitter 、Facebook、Craigslist、TicketMaster (一个出售各类演唱会、体育比赛、歌剧以及艺术展览门票的网站)以及微软( Microsoft )。 Bursztein 希望开发者能够更加系统的设计和使用验证码技术,他举了一个例子: 20 世纪 80 年代人们通常埋头设计的自己的计算机程序算法,但随着时间的推移,大家发现对等测试和专业安全性评估也是非常重要的。 展望验证码的未来 yixieshi.com 较早前有报道指出, Google 正在测试一种新的验证码技术,这种验证码技术不像传统验证码系统要求输入文字,而是要求用户将图形旋转到正确的方向: 另一种基于图像的验证码: yixieshi.com 类似的验证码还有要求用户输入当前时间,所访问的网站域名,自己所在的时区,甚至美国总统姓名,人类第一颗登陆的地外星球等。这类验证码主要考虑到通常自动计算机程序没有足够的逻辑思考能力,不能辨识并解答逻辑问题。拼图验证码,找不同验证码(比如从几张猫的图片中找出一张狗的图片)的验证码从本质上来说也非常类似,但目前没有大规模部署这类验证码的主要原因是没有足够的资源,难以抵挡穷举攻击(攻击者多次刷新验证码后可能出现相同的问题)。 要求用户绘制图形的验证码: 要求用户完成复杂算术题的验证码——显然过于复杂而显得不友好: 验证码也带来了更多的可能性,比如通过广告盈利的机遇,下面这则验证码示范了利用验证码展示广告: 但遗憾的是由于其同样不具有规模性,仍受到穷举攻击的威胁。 这些未来的验证码技术同时还应该考虑到辅助功能。假如用户有视力障碍,他应该可以选择通过聆听验证码音频的方式完成验证,这也是基于字符的验证码技术迟迟未能被取代的主要原因之一。 互联网的一些事 总结 验证码技术是一种计算机技术发展下的矛盾产物,人类渴望计算机能够通过自动化的过程完成更多的任务,却同样要防止计算机被利用在破坏与恶意的用途当中。随着人工智能领域的研究成果越来越先进,计算机将变得越来越通情达理(想想 Siri ,想想 IBM 最新的超级智能计算机 Watson)。 图灵当年设计图灵测试时,旨在推动人工智能的发展,并从哲学与计算机科学的角度上论证制造类人类机器人的可行性,但他恐怕永远也想象不到有一天,人类将如此迫切的需要一种技术来将自己与计算机系统严格地区分开来。
‘伍’ 为什么网页的验证码的字母总是那么难辨认
我来说下自己的想法,本人在一家做图像识别的公司呆了三年,做销售工作。识别验证码的使用的技术是光符字符识别技术,即OCR技术,就是将图片中的文字识别为电子流的技术。这项技术目前已经得到广泛应用,比如扫描识别,身份证识别,银行卡号识别,车牌识别等等。验证码识别也是其中一种,也是难度比较大的一种。为什么难呢,一方面是因为它总体来说没有规律,无法使用模版识别方式,身份证识别是典型的模版识别方式,因为身份证识别位置是固定的。另一方面是各类因素影响识别率较大,比如倾斜,背景等。总的来说就是目前ocr技术无法使验证码识别率达到一个满意的效果。哪些核心技术限制了它的识别率呢?
1.倾斜矫正技术。整个识别验证码流程大概是这样的。先将验证码区域图像获取下来,进行二值化,将图片中的字符一个一个切分出来,分别进行识别,输出整体识别结果。当一个字符是歪的时候(此处说的歪是大于一定角度的,具体记不清了,但验证码中经常出现),切下来后无法进行倾斜矫正,那么计算机可能认为要识别的字就是这样的,识别后肯定是错误的。为什么不能进行倾斜矫正呢?因为倾斜矫正是需要一个基准点的,比如身份证识别可以拿照片位置做记住点,这样倾斜多少度识别引擎是知道的,就可以矫正,但验证码没有。所以验证码识别这倾斜矫正是一个难点!
2.图像质量影响。目前的ocr技术一般都需要二值化,即将彩色图片变为黑白的后再进行切分识别。但这块有个痛点,就是背景颜色要比识别的字颜色要浅这样识别才有保证,但验证码有的不是这样,影响了识别率。另外就是获取但的图片分辨率不够,ocr识别是需要每个字要有一定的dpi的,验证码很多字达不到,ocr识别率当然差。不要跟我说你能看清,因为人往往是理想的,但技术是脚踏实地的,这块后边我会说。为什么有些网站的验证码特别简单,以上的问题基本没有,ocr识别率应该不低,却没人做识别插件呢?这个需要从商务角度说,我认为有以下几点:
1.还是识别率不够高。对于需要这项技术的公司,一般都是做产品的,他们会对用户体验这块非常的关注。你设想一下,当你抢票的时候,验证码识别结果一出来,竟然有两个字符是错的,你还要去改,你肯定会骂娘,唠叨不如老子自己手输了。对于这些产品公司他们肯定会关注这点啊,所以有些这块不是强需求的公司就不做这块了。但对于有些产品,这块用户需求巨大,比如抢火车票的这种产品,这块是竞争的一个巨大优势,在目前技术达不到非常高的识别率又不想太影响用户体验情况下,他们是怎样做的呢?先要说下引擎的识别结果不是只有一个的,而是很多计算机认为可能的结果,每个结果都有一个分数,最后选分数最高的一个为输出结果。通过大量训练比对,可模糊确定界定正确和不正确结果的一个值。好了回到之前的问题,产品公司通过这个值来只输出他们认为绝对正确的结果,而有的所有识别结果都没超过这个值,那就不输出了,用户自己填。这样做的好处是,减少了用户一定的操作,又不太影响用户体验。真是印证了我们总跟客户说的那句话,目前这些技术只能减轻用户的工作量,而不能完全代替!之前这种方法效果也不是太好,因为这个值太难界定,错误率也不低,所以一些有钱的公司是这样做的:买两家技术,识别结果进行比对,输出比对一样的即他们认为绝对准确的结果,比对不一样的结果则不输出,这种方法是目前比较好的方法,但成本比较高。老版本的智行火车票好像就这么做的。
2.验证码设定奇葩。我们想输入省事儿设定验证码的肯定要阻止啊,出了一批连人都不容易知道怎么输的验证方式,这已经超出图像识别领域,尤其是一些流量大的公司,图片我都看不懂计算机能懂么!
3.技术自主研发公司的壁垒。这些技术公司也要发工资吃饭的,验证码识别只是图像识别应用的很小一部分,和主流的市场需求量大的身份证识别,银行卡识别,票据识别比需求量还是小,况且有重重阻碍,技术推动力自然小,技术进步很慢。好了,以上回答按照我的理解基本可以解答题主问题,目前验证码识别应用率不高主要因为技术瓶颈和市场阻碍因素。下面我说点题外话,仅代表我个人观点,不吐不快。当我刚开始做核心技术销售的时候和后段技术人员冲突很多。以题主想法举例,销售站在客户角度认为既然能够看清,图片效果不错,那识别应该问题不大。而后端技术给出的结果是无法保证,那么冲突来了,是我一厢情愿过于理想还是技术不给力。当我全程看到他们做的事之后,才改变了我的认知。为了提升零点几的识别率,他们需要大量的数据进行训练,这些数据收集来的少大多是买来的,特别贵。大量数据拿来后经过初步的过滤,技术人员通过算法进行切分。你能想想几T的全文字图片数据切分成单个字符有多少么。然后需要数据部门大量人工对这些字符进行人工标注(标注每个字符图片的识别结果),这个时间可能是通宵达旦的几天,可能是几个月。然后将分类好的字符拿给技术进行初步训练,然后统计,优化算法。好,再来一轮,训练,优化算法。一遍一遍,直到达到预期目标。这里需要大量的人工参与,大量的资金,大量的时间为了提升一点点的识别率。这还不算核心技术人员脑洞大开的精力和时间,还有进行前期实验的时间。我不止一次看到他们冥思苦想,通宵达旦,反复实验。说实话,我看着都枯燥,都累。但就是这些我们所说的码农单身狗,让人机智能交互技术一点一点在往前走,脚踏实地。往小了说这是他们的职责,往大了说他们就是在默默无闻的改变我们的生活!为什么我之前会给客户肯定答案呢?因为我理想,想当然,对技术不了解,或者说根本不了解他们在做什么!所以请不要像我以前一样在不了解实际情况之前说:这是可以做的啊,看着挺简单啊,为什么没人做啊?不去了解如何知道可以,如何知道简单,如何知道这东西没人在做?只是不了解不知道罢了,这是对默默无闻搞研究的技术人员的一种不尊重!如果现在在遇到不敢肯定的技术问题,我会坦然的跟客户说:不好意思,这块我确实不是很清楚,我需要问下我们专业的技术人员。
‘陆’ 识别验证码的算法
一、验证码的基本知识
1. 验证码的主要目的是强制人机交互来抵御机器自动化攻击的。
2. 大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能
的基本概念。
3. 利用验证码,可以发财,当然要犯罪:比如招商银行密码只有6位,验证码形同虚设,计
算机很快就能破解一个有钱的账户,很多帐户是可以网上交易的。
4. 也有设计的比较好的,比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证
码虽然难,但算不上好。
二、人工智能,模式识别,机器视觉,图像处理的基本知识
1)主要流程:
比如我们要从一副图片中,识别出验证码;比如我们要从一副图片中,检测并识别出一张
人脸。 大概有哪些步骤呢?
1.图像采集:验证码呢,就直接通过HTTP抓HTML,然后分析出图片的url,然后下载保存就
可以了。 如果是人脸检测识别,一般要通过视屏采集设备,采集回来,通过A/D转操作,存为
数字图片或者视频频。
2.预处理:检测是正确的图像格式,转换到合适的格式,压缩,剪切出ROI,去除噪音,灰度
化,转换色彩空间这些。
3.检测:车牌检测识别系统要先找到车牌的大概位置,人脸检测系统要找出图片中所有
的人脸(包括疑似人脸);验证码识别呢,主要是找出文字所在的主要区域。
4.前处理:人脸检测和识别,会对人脸在识别前作一些校正,比如面内面外的旋转,扭曲
等。我这里的验证码识别,“一般”要做文字的切割
5.训练:通过各种模式识别,机器学习算法,来挑选和训练合适数量的训练集。不是训练
的样本越多越好。过学习,泛化能力差的问题可能在这里出现。这一步不是必须的,有些识
别算法是不需要训练的。
6.识别:输入待识别的处理后的图片,转换成分类器需要的输入格式,然后通过输出的类
和置信度,来判断大概可能是哪个字母。识别本质上就是分类。
2)关键概念:
图像处理:一般指针对数字图像的某种数学处理。比如投影,钝化,锐化,细化,边缘检测,
二值化,压缩,各种数据变换等等。
1.二值化:一般图片都是彩色的,按照逼真程度,可能很多级别。为了降低计算复杂度,
方便后续的处理,如果在不损失关键信息的情况下,能将图片处理成黑白两种颜色,那就最好
不过了。
2.细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能
大于1。不同的细化算法,可能有不同的差异,比如是否更靠近线条中间,比如是否保持联通
行等。
3.边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地
方。可能通过一个固定的门限值来判断,也可能是自适应的。门限可能是图像全局的,也可
能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被
分析的,可能是颜色,也可能是灰度图像的灰度。
机器视觉:利用计算机来模式实现人的视觉。 比如物体检测,定位,识别。按照对图像
理解的层次的差别,分高阶和低阶的理解。
模式识别:对事物或者现象的某种表示方式(数值,文字,我们这里主要想说的是数值),
通过一些处理和分析,来描述,归类,理解,解释这些事物,现象及其某种抽象。
人工智能:这种概念比较宽,上面这些都属于人工智能这个大的方向。简单点不要过分
学院派的理解就是,把人类的很“智能”的东西给模拟出来协助生物的人来处理问题,特别是
在计算机里面。
‘柒’ 如何利用Python做简单的验证码识别
1摘要
验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。
然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
2关键词
关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL
3免责声明
本文研究所用素材来自于某旧Web框架的网站完全对外公开的公共图片资源。
本文只做了该网站对外公开的公共图片资源进行了爬取,并未越权做任何多余操作。
本文在书写相关报告的时候已经隐去漏洞网站的身份信息。
本文作者已经通知网站相关人员此系统漏洞,并积极向新系统转移。
本报告的主要目的也仅是用于OCR交流学习和引起大家对验证安全的警觉。
4引言
关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:
互联网安全防火墙(1)--网络验证码的科普
里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容。本章内容则作为它的技术补充来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。
5基本工具
要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。普通程序员已经不需要了解复杂的数学原理,即可以实现对这些工具的应用了。
主要开发环境:
python3.5
python SDK版本
PIL
图片处理库
libsvm
开源的svm机器学习库
关于环境的安装,不是本文的重点,故略去。
6基本流程
一般情况下,对于字符型验证码的识别流程如下:
准备原始图片素材
图片预处理
图片字符切割
图片尺寸归一化
图片字符标记
字符图片特征提取
生成特征和标记对应的训练数据集
训练特征标记数据生成识别模型
使用识别模型预测新的未知图片集
达到根据“图片”就能返回识别正确的字符集的目标
7素材准备
7.1素材选择
由于本文是以初级的学习研究目的为主,要求“有代表性,但又不会太难”,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。
最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。
原始图:
然后就将图片素材特征化,按照libSVM指定的格式生成一组带特征值和标记值的向量文
‘捌’ 如何对中文验证码中的文字进行拆分,旋转和切割(python),为了容易识别一点
#-*-coding:utf-8-*-
importImage,ImageDraw,ImageFont
importrandom
importmath,string
classRandomChar():
"""用于随机生成汉字"""
@staticmethod
defUnicode():
val=random.randint(0x4E00,0x9FBF)
returnunichr(val)
@staticmethod
defGB2312():
head=random.randint(0xB0,0xCF)
body=random.randint(0xA,0xF)
tail=random.randint(0,0xF)
val=(head<<8)|(body<<4)|tail
str="%x"%val
returnstr.decode('hex').decode('gb2312')
classImageChar():
def__init__(self,fontColor=(0,0,0),
size=(100,40),
fontPath='wqy.ttc',
bgColor=(255,255,255),
fontSize=20):
self.size=size
self.fontPath=fontPath
self.bgColor=bgColor
self.fontSize=fontSize
self.fontColor=fontColor
self.font=ImageFont.truetype(self.fontPath,self.fontSize)
self.image=Image.new('RGB',size,bgColor)
defrotate(self):
self.image.rotate(random.randint(0,30),expand=0)
defdrawText(self,pos,txt,fill):
draw=ImageDraw.Draw(self.image)
draw.text(pos,txt,font=self.font,fill=fill)
deldraw
defrandRGB(self):
return(random.randint(0,255),
random.randint(0,255),
random.randint(0,255))
defrandPoint(self):
(width,height)=self.size
return(random.randint(0,width),random.randint(0,height))
defrandLine(self,num):
draw=ImageDraw.Draw(self.image)
foriinrange(0,num):
draw.line([self.randPoint(),self.randPoint()],self.randRGB())
deldraw
defrandChinese(self,num):
gap=5
start=0
foriinrange(0,num):
char=RandomChar().GB2312()
x=start+self.fontSize*i+random.randint(0,gap)+gap*i
self.drawText((x,random.randint(-5,5)),RandomChar().GB2312(),self.randRGB())
self.rotate()
self.randLine(18)
defsave(self,path):
self.image.save(path)
‘玖’ python pil 怎么去掉验证码线条
一、验证码识别的概念
机器识别图片主要的三个步骤为消去背景、切割字符、识别字符。而现有的字符验证码也针对这三个方面来设计强壮的验证码。
以下简图帮助大家理解验证码识别的流程:
二、处理流程
其中最为关键的就是好图像处理这一步了。图像处理功能模块包括图像的灰度化、二值化、离散噪声点的去除、倾斜度校正、字符的切割、图像的归一化等图像处理技术 。
1、 图像的灰度化
由于 256 色的位图的调色板内容比较复杂,使得图像处理的许多算法都没有办法展开,因此有必要对它进行灰度处理。所谓灰度图像就是图像的每一个像素的 R、G、B 分量的值是相等的。彩色图像的每个像素的 R、G、B 值是不相同的,所以显示出红绿蓝等各种颜色。灰度图像没有这些颜色差异,有的只是亮度上的不同。灰度值大的像素点比较亮(像素值最大为 255,为白色),反之比较暗(像素值最小为 0,为黑色)。图像灰度化有各种不同的算法,比较直接的一种就是给像素的 RGB 值各自一个加权系数,然后求和;同时还要对调色板表项进行相应的处理。
2、 图像的二值化
要注意的是,最后得到的结果一定要归一到 0-255 之内。因为这是每个字节表示
图像数据的极限。
3、 去噪
图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不适合用在处理字符这样目标狭长的图像中,因为在滤波的过程中很有可能会去掉字符本身的像素。
一个采用的是去除杂点的方法来进行去噪声处理的。具体算法如下:扫描整个图像,当发现一个黑色点的时候,就考察和该黑色点间接或者直接相连接的黑色点的个数有多少,如果大于一定的值,那就说明该点不是离散点,否则就是离散点,把它去掉。在考察相连的黑色点的时候用的是递归的方法。此处,我简单的用python实现了,大家可以参考以下。
#coding=utf-8"""
creat time:2015.09.14
"""import cv2import numpy as npfrom matplotlib import pyplot as pltfrom PIL import Image,ImageEnhance,ImageFilter
img_name = '2+.png'#去除干扰线im = Image.open(img_name)#图像二值化enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
data = im.getdata()
w,h = im.size#im.show()black_point = 0for x in xrange(1,w-1): for y in xrange(1,h-1):
mid_pixel = data[w*y+x] #中央像素点像素值
if mid_pixel == 0: #找出上下左右四个方向像素点像素值
top_pixel = data[w*(y-1)+x]
left_pixel = data[w*y+(x-1)]
down_pixel = data[w*(y+1)+x]
right_pixel = data[w*y+(x+1)] #判断上下左右的黑色像素点总个数
if top_pixel == 0:
black_point += 1
if left_pixel == 0:
black_point += 1
if down_pixel == 0:
black_point += 1
if right_pixel == 0:
black_point += 1
if black_point >= 3:
im.putpixel((x,y),0) #print black_point
black_point = 0im.show()041424344
原验证码:
4、分割
图像中一般会含有多个数字,识别的时候只能根据每个字符的特征来进行判断,所以还要进行字符切割的工作。这一步工作就是把图像中的字符独立的切割出来。
具体的算法如下:
第一步,先自下而上对图像进行逐行扫描直至遇到第一个黑色的像素点。记录下来。然后再自上而下对图像进行逐行扫描直至找到第一个黑色像素,这样就找到图像大致的高度范围。
第二步,在这个高度范围之内再自左向右逐列进行扫描,遇到第一个黑色像素时认为是字符切割的起始位置,然后继续扫描,直至遇到有一列中没有黑色像素,则认为这个字符切割结束,然后继续扫描,按照上述的方法一直扫描直至图像的最右端。这样就得到了每个字符的比较精确宽度范围。
第三步,在已知的每个字符比较精确的宽度范围内,按照第一步的方法,分别进行自上而下和自下而上的逐行扫描来获取每个字符精确的高度范围。
5、 图像的归一化
因为采集的图像中字符大小有可能存在较大的差异,或者是经过切割后的字符尺寸不统一,而相对来说,统一尺寸的字符识别的标准性更强,准确率自然也更高,归一化图像就是要把原来各不相同的字符统一到同一尺寸,在系统实现中是统一到同一高度,然后根据高度来调整字符的宽度。具体算法如下:先得到原来字符的高度,跟系统要求的高度做比较,得出要变换的系数,然后根据得到的系数求得变换后应有得宽度。在得到宽度和高度之后,把新图像里面的点按照插值的方法映射到原图像中。
不少人认为把每个字符图像归一化为 5×9 像素的二值图像是最理想的,因为图像的尺寸越小,识别速度就越高,网络训练也越快。而实际上,相对于要识别的字符图像, 5×9 像素图太小了。归一化后,图像信息丢失了很多,这时进行图像识别,准确率不高。实验证明,将字符图像归一化为 10×18 像素的二值图像是现实中是比较理想的,达到了识别速度快和识别准确率高的较好的平衡点。
三、识别
图像识别包括特征提取、样本训练和识别三大块内容。
验证码识别其中最为关键的就是去噪和分割,这对你的训练和识别的精度都有着很大的影响。这里只讲了大致的流程,其中每个细节都有很多工作要做,这里码字也很难讲清楚,大家可以以这个流程为主线,一步步的实现,最终也就能完成你的需求。
‘拾’ 易语言QQ验证码怎么做
验证码是简单的数字或字母,规则且不勾,不连,不交叉,颜色基本统一的; 将规则的数字或字母按某种规则扫描后的特征码存入相应的数组; 本方法只适用指定的验证码图片,具体表现在切割尺寸上;制作思路:打开载入图片到画板1----->整体扫描(遍历)画板1---->根据画板1的某点的颜色值做出判断 ----大于某个值在编辑框里加入“X”,否则加入“.”----->然后切割,即:按切割尺寸复制 到另外四个画板----->对四个画板扫描,一样根据颜色值做出判断,一样加入另外四个编辑框 ---->最后根据四个编辑框里的“特征码”和我们之前规则数字或字母的特征码对比,相似度 高的就是我们所要的数字或字母;..