C#简单数字验证码解析

使用C#进行验证码识别 / 确保您的计算机上已安装了.NET Framework,并且可以使用Visual Studio等开发工具。// 下载Chrome浏览器并安装,然后下载与您的Chrome浏览器版本匹配的ChromeDriver。// 将ChromeDriver可执行文件的路径添加到系统的PATH环境变量中。// 在此处添加您的自动化操作,如登录或数据爬取。// 步骤5:将识别的验证码文本填写到输入框。// 步骤6:完成验证码识别。// 步骤4:使用Tesseract进行验证码识别。// 步骤1:配置C#开发环境。 阅读详情

原文地址:http://www.cnblogs.com/ivanyb/archive/2011/11/25/2262964.html

这几天都在研究验证码解析,写了一个DEMO,对于纯数字且生成位置变化频率较低的图片识别效果还算满意,准确率在80%以上,更高级别的验证码还有待研究。

CSharp简单数字验证码解析.rar

 

具体实现思路:以4位数字的验证码为例

1、人工将验证码的4位数字每位对应的代码存入数据库中,每位存入0-9对应的代码,每个数可以多存这样可以提高识别率;

2、获取验证码image以后,对其进行去背景、灰度处理、去噪点处理、分片处理以后生成每位数字对应的代码;

3、去背景色,这一步的目的是把验证码和背景颜色区别开来。

去除背景的算法,依赖于验证码图像的特征:

1、首先需要知道背景色  
  最简单的方法就是把最左上角的点的量化值作为背景色。
  优化一点可以取图像矩形的topleft,topright,bottomleft,bottomright这4个点比对。
  或者取更边界上更多点比对。

2、扫描m*n图像矩形,从每个具有背景色的点出发找到整个连接块,设置matrix[i,j]=0。
  这是一个很简单的带剪枝的DFS算法,很快就能把背景色去除,本例用第二种。

4、去噪声:这一步要取出图像上的孤立点。这些孤立点被认为是噪声。
  孤立点的定义:某个点,周围没有与该点等值的点。
  或者某个连接块,该连接块的元素的个数小于某个给定值K, 把元素个数很小的连接块也定义为孤立点,有助于去处噪声。
  去噪声算法:参照去背景算法。

5、图像锐化:图像锐化的目的是增强边界。这一步是可选的。看验证码的情况,这一步可以跳过。

6、图片有效区域截取:这个操作是将图片除验证码字符以外的边框去掉,只留下验证码字符图片,这样保证分片的准确性。

7、图片分片处理,这个处理是将整个图片分割成单个字符图片。

1、连接块法:找到矩阵中除背景外所有的连接块,把每个连接块作为一个子图。
  不适用于子图存在断裂的情形。
   实现:带剪枝的DFS。

2、子图分割:如果验证码是定长的,且字符之间等距。
  可以用一个简单的垂直分割把子图提取出来。
  这种方法适用于子图断裂,用连接块法提取失败的情形。 本例用第二种。

3、有某些类型的验证码用上面2个方法都难以提取子图

8、拿分片图像生成的代码(eg:000111110011…..)与DB中已有代码相比较,取得相似度最高的即要验证码的字符;

 

注:如果DB的样本越多,识别的准确率也越高,但是速度会相应变慢

 

主要实现方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <summary>
         /// 根据RGB,计算灰度值
         /// </summary>
         /// <param name="posClr">Color值</param>
         /// <returns>灰度值,整型</returns>
         private  int  GetGrayNumColor(System.Drawing.Color posClr)
         {
             return  (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;
         }
 
         /// <summary>
         /// 灰度转换,逐点方式
         /// </summary>
         public  Bitmap GrayByPixels()
         {
             for  ( int  i = 0; i < bmpobj.Height; i++)
             {
                 for  ( int  j = 0; j < bmpobj.Width; j++)
                 {
                     int  tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i));
                     bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));
                 }
             }
             return  bmpobj;
         }

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/// <summary>
         /// 得到图片有效区域,使切分图片更加精确
         /// </summary>
         /// <param name="_bitmap"></param>
         /// <returns></returns>
         private  Bitmap CutMap(Bitmap _bitmap)
         {
             Rectangle rg = new  Rectangle( int .Parse(updX.Value.ToString()), int .Parse(updY.Value.ToString()), _bitmap.Width - int .Parse(updW.Value.ToString()), _bitmap.Height - int .Parse(updH.Value.ToString()));
             //Rectangle rg = new Rectangle(1, 0, _bitmap.Width - 10, _bitmap.Height );
             Bitmap bitmap = _bitmap.Clone(rg, _bitmap.PixelFormat);
             return  bitmap;
 
         }

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
         /// 切分图片
         /// </summary>
         /// <param name="_bitmap"></param>
         /// <param name="row"></param>
         /// <param name="col"></param>
         /// <returns></returns>
         private  Bitmap[] SplitImg(Bitmap _bitmap, int  row, int  col)
         {
             int  singW = _bitmap.Width / row;
             int  singH = _bitmap.Height / col;
             Bitmap[] arrmap = new  Bitmap[row * col];
             Rectangle rect;
             for  ( int  i = 0; i < col; i++)
             {
                 for  ( int  j = 0; j < row; j++)
                 {
                     rect = new  Rectangle(j * singW, i * singH, singW, singH);
                     arrmap[i * row + j] = _bitmap.Clone(rect, _bitmap.PixelFormat);
                 }
             }
 
             return  arrmap;
         }

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <summary>
         /// 获取数字对应的二值化代码
         /// </summary>
         /// <param name="_bitmap"></param>
         /// <param name="p"></param>
         /// <returns></returns>
         private  string  GetCodebybitmap(Bitmap _bitmap, Panel p)
         {
             StringBuilder code = new  StringBuilder();
             Graphics g = p.CreateGraphics();
             for  ( int  i = 0; i < _bitmap.Width; i++)
             {
                 for  ( int  j = 0; j < _bitmap.Height; j++)
                 {
                     int  r = _bitmap.GetPixel(i, j).R;
                     if  (r < 100) //常用的是灰度128
                     {
                         code.Append( "1" );
                         g.DrawString( "-" , new  Font( "宋体" , 12), new  SolidBrush(Color.Blue), new  Rectangle(i * 5, j * 5, 12, 12));
                     }
                     else
                     {
                         code.Append( "0" );
                     }
                 }
             }
 
             return  code.ToString();
 
         }

效果:

image

人生无处不PK

C#下的验证码识别 1)验证码的基本知识及来由 网络安全技术中的验证码的主要目的是强制人机交互来抵御机器自动化攻击。用来防止机器模拟http行为,直接抓取文本进行导航;或直接提交文本进行登录尝试。在现在带宽较大的今天,在綫密码穷举带宽已经不能作为瓶颈了,验证码识别以2M ADSL连接实际测试,20綫程大概每秒可以完成30个左右的连接,如果是6位数字密码,在不考虑字典完全穷举的时候也只需要几个小时便可破解,严 阅读详情

相关推荐

C#实践开发_Winform 系列七:数字验证码

数字验证码 文章目录数字验证码前言一、结果呈现1. 界面设计2. 运行结果呈现二、源码1.Form.cs2.Form.Designer.cs三、总结 前言 C#实践开发_Winform 系列第七篇:随机数字验证码,掌握如何创建Graphics类,并用于图像处理。 一、结果呈现 1. 界面设计 窗体界面设计:一个标签控件,一个文本框控件,一个Button按钮控件,一个pictureBox图像框控件。 2. 运行结果呈现 二、源码 1.Form.cs 代码如下(示例): using Sys

iceberg7012的博客 582

C# 识别图片验证码

最近有需求需要用C#识别图片验证码,于是又是各种百度啊csdn啊论坛啊,找啊找,找到了很多,老实说都不尽人意,然后去github上翻了一下,还真的有。

lmttlw的博客 2042

C#实现验证码噪点绘制的实战教程

是一个强大的命名空间,它属于.NET Framework的一部分,提供了丰富的API用于处理图像、绘制图形以及处理字体和颜色等。在开发中,无论是Web应用、桌面应用还是服务端程序,开发者经常会涉及到图像处理,此时就能发挥出巨大作用。其重要性体现在以下几个方面:图像处理:通过Bitmap类,可以加载、创建、保存和操作图像。绘图功能:Graphics类提供了强大的绘图工具,从基本的几何形状绘制到复杂的图像操作都可实现。字体与颜色管理。

weixin_34471637的博客 1348

C# 验证码识别(第一讲)

一、AspriseOCR 下载地址 二、将整个项目asprise-ocr-api添加到自己的项目中,然后执行下面代码: 三、使用using asprise_ocr_api;命名空间。 四、在执行的时候需要将aocr.dll 以及aocr_x64.dll文件放在debug目录中才可以使用,不能直接进行引用。 五、代码如下 AspriseOCR.SetUp();

啊渊的专栏 7556

C#中实现不区分大小写的验证码验证方法

ToLower() 和 ToUpper() 是在编程中常用的字符串处理方法,它们分别用于将字符串中的所有字符转换为小写或大写。这两个方法通常用在需要忽略字符大小写的场景中,以保证比较的一致性。ToLower() 方法会遍历字符串中的每个字符,并将其转换为小写形式,而 ToUpper() 方法则是将字符转换为大写形式。这种方法特别适合于验证用户输入,例如在登录、注册过程中验证用户输入的验证码时,不区分大小写,从而提升用户体验。光学字符识别(OCR)技术是将图像中的文字转换为机器编码的过程。

weixin_35920379的博客 1027

C#实现OCR手写数字识别

这是一个用C#实现的手写数字识别的范例程序

计算式子代码(分析 + 图 + 代码)

计算式子代码分析: 1.给放数字两个文本框,用两个个整数接收然后给这个两个文本框转换数字类型 2.(组合框中的项)comboBox1.SelectedItem;获取设置ComboBox中当前选定的项,有因为这个时Object 定义一个变量接收一下 3.判断 comboBox1.SelectedItem的变量名是否==SelectedItem下拉框里面的项 4.判断if如果等于ComboBox这个里...

qq_44858151的博客 532

C#验证码识别

C# 验证码识别:1.图像预处理;2.字符分割;3.对分割后的信息提取特征;4.用特征和样本进行匹配。

C#彩色扭曲验证码

该验证码生成类集合了网上大部分的验证码生成类的精华,并多次改进,现在已经形成了可在生产环节中使用的验证码。 该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊等。完全可以实现防识别。 按照国际惯例先贴张效果图吧: #region 验证码生成类 /// /// 验证码生成类 ///

FrankHu 3696

C#实现的简单验证码识别实例

最近做一个小玩意需要识别验证码,之前从来没有接触过识别验证码这块,这可难倒了我。所以,在网上搜索如何识别验证码,许多前辈写的博文教会了我。怕以后又忘记了,故此写篇随笔记录。 我要识别的验证码是一种非常简单,如图: 识别步骤: 1、图片灰度化(把彩色的验证码图片转换成灰色的图片)、图片二值化 代码如下: for (int i = 0; i < bmp.Width; i++)             {                 for (int j = 0; j < bmp.Height; j++)        //双重循环,遍历验证码图片的像素点                 {

从BIN文件到可烧录程序:深入理解ADI DSP程序读取背后的原理与安全边界

本文深入探讨了ADI DSP程序从BIN文件到可烧录程序的转换原理与安全边界,详细解析了JTAG接口、仿真器工作流程及Flash存储结构。通过Visual DSP++工具,开发者可以理解程序读取的底层机制,同时强调了知识产权保护的重要性,为嵌入式开发提供了实用建议。

weixin_27956639的博客 261

C#使用Tesseract OCR 解析验证码

原文地址:http://www.cnblogs.com/ivanyb/archive/2011/11/25/2263043.html 之前我在C#简单数字验证码解析>>一文中介绍了用C#识别简单不变形数字验证码,但是对于识别变形的 或生成位置变化比较频繁的 验证码的准确率却不高。 下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高,并不

码农 2465

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 682

生成验证码解析

撰写时间:2019年04月25日 在现在的网络时代,验证码已经是不可缺少的一种验证各网站、发帖、评论等等不可缺少的验证方法 今天我们就一起来看看如何制作随机的数字、英文的验证码吧 public static class ValidCodeUtils //公共静态 {public static string GetRandomCode(int intLength) {产生数字和密码混合的随机数,创建...

weixin_44549330的博客 320

告别爆显存!手把手教你为ComfyUI+华为Atlas 300I Duo配置wan2.1视频生成工作流(含CPU-VAE参数)

本文详细介绍了华为Atlas 300I Duo与ComfyUI的深度适配实战,重点优化wan2.1视频生成工作流。从硬件散热改造到软件栈配置,再到ComfyUI专项优化,提供完整的解决方案,显著提升视频生成效率与稳定性,特别适合需要高效文生视频的应用场景。

weixin_26812607的博客 456

绕过限制?实测修改UA在PC端运行微信小程序的可行性及风险

本文探讨了通过修改User-Agent(UA)在PC端运行微信小程序的技术可行性及风险。分析了小程序设备限制的技术原理,包括`wx.getSystemInfo`API和UA检测机制,并提供了多种修改方案及其局限性。同时强调了潜在的安全和法律风险,推荐使用官方模拟器或安卓模拟器等更安全的替代方案。

weixin_30879169的博客 360

使用C#登录带验证码的网站

我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法。验证码的由来几年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据。...

dkopg24406的专栏 340

【STM32】R05D电控红外协议的美的空调遥控器

目录一、设计思路一、R05D红外协议原理1.协议手册理解2.验证时序(重点)二、硬件实现1.需要的材料2.对发射模块电路进行修改3.STM32 GPIO选择三、代码实现1.载波38kHZ实现2.R05D时序实现3.调用函数并验证 一、设计思路 通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 R05D电控功

weixin_42204837的博客 1万+
上一篇: C#使用Tesseract OCR 解析验证码
下一篇: 如何识别高级的验证码
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值