关于验证码识别 1

第一遍文章可以入门

第一部份 图片的组成及特征码的定义

  做为验证码的识别,那我们首先需要了解的就是基本的原理,这里就是先说清楚这个原理,再往后大家看代码就比较容易明白了(其实本来就比较简单,我说这么多就是为了大家看完不说我的水平次罢了。再次爆汗~!)
正题了,其实整个验证码的识别的话我们先得分解一个图,每一个图形其实都是由每一个点和每一个点来组成的,说到每个点其实就是一个色块,当每一个色块拼接起来就成了一个图形,这个虽然说有点废话,但我还是提一下。
需要更好的理解我们来看图:

图一 图二

  通过上面的两幅图片我们就能很清楚的知道色块情况了,每一个小块就是一个色块,有些用白色来表示,而整个图的点则也是通过坐标来识别的,X,Y两个点,这样我们就不难分清行和列了,当我们取色块X1,Y1就是指取出第一行,第一列,如果我们取色块为X2,Y5则是指第五行,第二个色块。呵呵!

  色块了解了,我们可以通过取色块中的颜色来做为一个比较和判断的识别标准。我们对一个图中的数字进行取色,当颜色的值为黑色(0)时,我们将点记录为1,当所取的点值为白色(255)时,我们将点记录为0。这样整张图取下来,我们就会得到一个字符串,格式如下:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111100001111111111111111001100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011001111111111111111000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000

  上面的这段类似二进制的字符串就是我们从图一中提出来的东西了,我们称这一个字符串为这张图片的特征码。这个特征的解读我们利用前面所说的知识来自己解读一下,以图一为参考,图一中的前面的四列都是白色,所以我们的特征码中开始好多个零。>_<
  从第五列开始,除了前面的两格是白色,接下来就是黑色了,这样我们开始数一下,就是应该有82个零,然后开始是1,嘿嘿~~~大家可以数一下。接着就开始到了黑色部份了,这里应该有11个黑色块,在我们的特征码中有11个1。这样的话大家就很清楚,这个特征码的结构了。

  好,现在对图片的解读我们已经很清楚了,接着就是用代码来实现了。未完待续(用代码实现特征码提取)



  第二部份 使用代码实现提取图片中的特征码

  上一章中我们说了图片组成及特征码的定义,不懂的请看第一部份。下面我们直接开始第二部份,我们这一章中将使用C#写一个Winform的程序来提取图片中的特征码。

  在这一章里我们的重点部份有3点
1、
Bitmap中的Bitmap.GetPixel(x,y) //这里是读取图片中的点中的颜色
注意:需要使用Bitmap的话我们则需要引用两个命名空间,分别为:
using System.Drawing;
using System.Drawing.Imaging;
  
2、图片中取了第个点,但一个点中的色彩是由R.G.B三个色组成,所以我们需要知道R.G.B的颜色,这里我们例程中的图片比较单一,而且文字是黑色的文字,黑色的RGB的色值为(255.255.255)所以,我们只需要取R值就行了,如果是文字中是多种颜色组成的话,最好用photoshop改成灰度,再进行取值,这样得到的特征码会比较准确。

3、取色值的时候使用到了循环嵌套,一个取行值,一个取列值,图片中每一个点都需要扫描到,最后就是注意“环保”,用完了要把图片关闭。(*_*)

  好了,知道了需要使用什么东西我们就开始写代码了。

  代码比较多,所以我就只在这里放重要部份的代码,而多余部份的代码大家自己下源程看吧,源程我会放在附件中,源程中尽量使用简单的代码,没有使用类,没有使用工厂模式,这样容易看得懂,但是却不是好的代码,所以大家如果自己做的话注意这个问题。
                //载入图片
                Bitmap bmp = new Bitmap(drawing);
                //每行每列扫描获取图片数字编码字符
                string CodeNumber = "";  //定义一个字符串变量用于存储特征码
                //对图进行逐点扫描,当R值不等于255时则将CodeNumber记为0,否则记为1
                for (int x = 0; x < bmp.Width; x++) //行扫描,由x.0至x.图片宽度
                {
                    for (int y = 0; y < bmp.Height; y++) //列扫描,由y.0至图片高度
                    {
                        if (bmp.GetPixel(x, y).R == 0)  //对图片中的点进行判断,当x,y点中的R色为0的时候
                        {
                            CodeNumber = CodeNumber + "1";  //记录为1
                        }
                        else   //否则
                        {
                            CodeNumber = CodeNumber + "0";  //记录为0
                        }                        
                    }
                }

//关闭图片
                bmp.Dispose();
                //将特征码显示在richTextBox1控件中显示出来
                richTextBox1.Text = CodeNumber;

  每行都有注释,多余的我就不说了。程序完成以后,我们将特征码记录下来。在后顺我们制作验证码识别器的时候需要使用。(未完待续 下一章,使用特征码制作验证码识别器)



第三章 验证码识别器的制作

  上一章我们说了特征码及特征码的提取,现在我们所需要的就是通过特征码来实现验证码的识别,其实聪明的朋友已经猜到了,这个验证码的识别到了这里就很明白了,没什么特别的就是将第每个色块提到的特征码进行对比,识别过程就是一个对比的过程。呵呵~~~我其实上就是为了再混个精华贴。好了,和上章一样,我这里给的代码比较少,需要详细代码的朋友直接下源程看吧,我的源程中注释都不少,应该比较容易能看懂,在这个例子中我的注释就不那么多了,因为重点和上个例子差不多。

  本章重点:
  1、使用上一章所制作的提取器,提取无杂情况下图片的特征码,并将0~9,单独数字的特征码保存,在这里程序开始的时候使用一个字符串数字,将每个特征码都做保存。格式如下:
            string[] Features;
            Features = new string[10];
            Features[0] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111100001111111111111111001100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011001111111111111111000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000";
            Features[1] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000011001100000000000000110011000000000000001100110000000000000011111111111111111111111111111111111111111100000000000000000011000000000000000000110000000000000000001100000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
…………

  2、注意图片中色块的RGB的色值。如果需要读取的验证码的图形的背景色中的色块的R值为多少及图片中文字中的色块的R值是多少,这个可以通过PHOTOSHOP或是其它的屏幕取色软件来实现。

  3、注意图片的长度和高度,上面提取的验证码是每一个单数字的长度及高度,而在这里是需要这整张图片的长度是多少,高度是多少,必需切成一个一个的数字进行验证。现在我们示列中的图片的总长度是120,其中包涵着6个数字,我们所提取的特征码为20*20,也就是说总长度必需分为6份,每单数字的高度为20,长度为20,循环6次就能得到整张图片。

  4、注意你图片中的误差,如果无杂点的情况下那么你的误差点可以为0,如果有杂点的情况下就需要判断你的数字的误差点与特征码中的误差数量是多少。这样才能更好的做出判断。也能提高准确率。

  好了,上面就是这一章的重点,现在我们开始继续我们的程序。

  首先我们要做就是先将特征码做做成一个字符串数组,在上面已经给出了,这里就不重复给出了,接着我们需要的就是载入图片,这里所载入的图片是需要识别的验证码的图片。然后我们对这个图片进行读取,而这里所读取的不是整张图片,而是将图片分成20*20的范围来读取,每读出一个20*20的范围就进行一次判断。使用一个循环就可以弄好了。如果不清楚的话一会自己看附件中的源程就能明白。

  做好读取图片中的特征码以后就是对我们图片中的特征码进行对比,首先是字符串的长度对比,当字符串的长度不相等的时候就不用判断了,因为这是不可能正确的,跳过,不能识别。-_-!!!
当验证码的长度相同,就开始判断两个字符串是否完全相等,如果完全相等的情况下就直接输出数字,说明这个数字无杂,除了背景以外,其它的都完全相同。
  如果字符串的长度相等,而字符串又不相等的时候我们就将字符串拆成字符串数组,一个一个的特征码进行比较,出现不相同的情况的时候就将错误点进行记录,这些错误点就是我们所说的误差点,最后做完整个循环判断以后如果错误点小于我们所设定的误差点的情况下,则等于此数,否则进入下一次的循环,当所有的特征码都进行对比,没有得到我们所需要的结果时,这个点将不能误别,继续跳过。

关于验证码识别 1

时间: 2024-07-28 17:38:46

关于验证码识别 1的相关文章

车牌识别及验证码识别的一般思路

http://www.pin5i.com/showtopic-22246.html 描述一下思路及算法. 全文分两部分,第一部分讲车牌识别及普通验证码这一类识别的普通方法,第二部分讲对类似QQ验证码,Gmail验证码这一类变态验证码的识别方法和思路. 一.车牌/验证码识别的普通方法 车牌.验证码识别的普通方法为: (1)      将图片灰度化与二值化 (2)      去噪,然后切割成一个一个的字符 (3)      提取每一个字符的特征,生成特征矢量或特征矩阵 (4)      分类与学习.

集美大学教务处验证码识别(二)

[原创,转载请标明作者:森狗] 本文对第二种验证码,即管理员登入后台地址的验证码进行识别. 1.采集一些验证码,0~9都要有 2.观察验证码,用画图工具即可. 观察可发现,噪点即阴影,此处的阴影就是颜色比主体验证码略淡,以此为突破口. 3.去除噪点 color.getGreen() 获取绿色的值int,绿色值(0~255 从深到浅),大于200的就是浅色的噪点 public static int isWhite(int colorInt) { Color color = new Color(co

常见验证码的弱点与验证码识别

http://drops.wooyun.org/tips/141 常见验证码的弱点与验证码识别 insight-labs · 2013/06/08 11:36 0x00 简介 验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助. 全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing t

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

【原创】用C#.NET开发通用的验证码识别组件

相信大家在开发过程中,基本都用到过验证码识别程序.一提到验证码识别,绝大多数兄弟想到的都是用C++的效率配上牛逼哄哄的二值化.边缘检测等算法来实现.但这种识别方式的依赖性太强,不可重用,无法扩展,假设对方稍微修改下验证码的变形算法(做过网站的都知道有多简单),可能你累死累活搞出来的识别程序就全部作废了. 这里讲个我们公司的例子,为了识别支付宝登录的验证码,公司花大价钱请了一位牛人B用C++写了个支付宝验证码识别的DLL并做了导出,供我们在.NET平台下直接调用.当我们项目开发快结束的时候,这货竟

验证码识别

  本文所使用的验证码识别的方法非常暴力,高手可忽略.对于在客户端实现的“伪验证码”或使用静态图片的验证码,本文不作讨论.对于验证码的识别,一直以为,只要足够的样本,就可以分析出验证码的特征,从而进行分门别类,再通过和样本做比较,就可以得出正确验证码.这里简单而暴力的验证一下这个一直想验证而没有行动过的想法.做实验的网站是某体检机构,因为它生成的验证码很有规律(不确定是不是静态文件,但就可以当成是算法随机生成的),每个字符的位置相对固定,虽然每个字符的颜色和背景都不一样,但是背景颜色很相近,没有

使用Tesseract-OCR 做验证码识别浅析

使用工具jTessBoxEditor-0.7(这个是在java平台下开发的,所以 它只支持java平台 ,在使用前应该先配置好java环境) tesseract 程序集(因为该程序集是在.net 2.0平台下 开发的,所以 只能支持到2.0 在使用时请注意(也可以自己去网上找别人用更高的版本编译好的)) tesseract-ocr-setup-3.01-1  使用开发语言.net 辅助工具 Visual Studio 至少能支持.net 2.0即可 首先,我们要找到自己需要做验证识别的验证码图片

.NET 开发的-服务于企业,个人用户群的打杂平台-可定制数据采集,刷单抢购,验证码识别各类插件

今天,想给大家介绍下自己做的一个小的插件管理平台,大白鲨智软平台,这不算什么高科技的东西,暂时还是个封闭的插件定制平台 没有提供开发相关的API接口,和开发工具,不过后面会加上去,以我多年的脚本引擎使用和开发经验,撸这个功能上去不会太久^_^ 先上张截图 上班几年专注数据采集平台研发也有日子了,现在成了SOHO,一直想做一个生态圈的数据采集验证码识别的小平台,目前平台看起来是封闭状态的,但是设计上是可以扩展到提供 脚本引擎+API扩展方式来让人轻松愉悦的进行数据采集的小插件开发中,当然,这并不是

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别 分类: 开放项目2012-07-23 17:28 6712人阅读 评论(0) 收藏 举报 tiffimagecompression引擎pascalcharacter --------------------------------------------------低调的分割线--------------------------------------------------- Linux下有两个重要的编程准则

(转)java验证码识别

java验证码识别--1 http://blog.csdn.net/problc/article/details/5794460 java验证码识别--2 http://blog.csdn.net/problc/article/details/5797507 java验证码识别--3 http://blog.csdn.net/problc/article/details/5800093 java验证码识别--4 http://blog.csdn.net/problc/article/detail