用 aforge.net 小试一下验证码识别

2023-10-29 02:30

本文主要是介绍用 aforge.net 小试一下验证码识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天来小玩一下 aforge.net 套用官方的话就是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域,下载网址:http://www.aforgenet.com/framework/downloads.html

对了,不知道有多少公司是用得仕卡作为员工的福利卡,我们公司就是这样的,每个月公司都会充值一些money????????????。

上去看了后,哟呵~ 还有个90年代的验证码,我想这年头估计找到这样验证码的网站已经不多了,如果懂一点图像处理都话,这张验证码跟没有一个样,这篇我们看看怎么去识别它。

一:验证码处理

1. 一般处理原则

这种验证码为什么说跟没有一样,第一点:字体规范工整,第二点:不旋转扭曲粘连,第三点:字体颜色单一,这里要注意的是, aforge 只接受像素格式为 24/32bpp 格式图片,所以处理前,先进行格式转化。

//转化图片像素格式var bnew = new Bitmap(b.Width, b.Height, PixelFormat.Format24bppRgb);Graphics g = Graphics.FromImage(bnew);g.DrawImage(b, 0, 0);g.Dispose();
<1> 图片灰度化

这是图像识别通常都要走的第一步,图片灰度化有助于减少后续对rgb的计算量,同时也方便我们进行二值化,在aforge中有专门的类一步搞定,简洁方便。

//灰度化b = new Grayscale(0.2125, 0.7154, 0.0721).Apply(b);
<2>二值化

二值化顾名思义就是二种值,比如非白即黑,非黑即白,那么白和黑的标准就需要提供一个阈值,大于或者小于怎么样,在aforge同样 也有相似的类进行处理。

//二值化b = new Threshold(50).Apply(b);
<3> 去噪点

从上面的图片可以发现有很多红点点,搞得像皮肤病一样,仔细观察可以看到这种噪点具有独立,体积小的特征,所以判断的标准就是如果图中某个区块的大小在我设置的阈值内,就将其去掉,同样也有专门的类进行处理。

//去噪点new BlobsFiltering(1, 1, b.Width, b.Height).Apply(b);

<4> 切割图片

切图片的好处在于我们需要知道真正要识别的元素的有效范围是多大,同时也方便我们将这些图片作为模板保存下来。

代码如下:

/// <summary>/// 按照 Y 轴线 切割/// (丢弃等于号)/// </summary>/// <param name="?"></param>/// <returns></returns>public List<Bitmap> Crop_Y(Bitmap b){var list = new List<Bitmap>();//统计每一列的“1”的个数,方便切除int[] cols = new int[b.Width];/**  纵向切割*/for (int x = 0; x < b.Width; x++){for (int y = 0; y < b.Height; y++){//获取当前像素点像素var pixel = b.GetPixel(x, y);//说明是黑色点if (pixel.R == 0){cols[x] = ++cols[x];}}}int left = 0, right = 0;for (int i = 0; i < cols.Length; i++){//说明该列有像素值(为了防止像素干扰,去噪后出现空白的问题,所以多判断一下,防止切割成多个)if (cols[i] > 0 || (i + 1 < cols.Length && cols[i + 1] > 0)){if (left == 0){//切下来图片的横坐标leftleft = i;}else{//切下来图片的横坐标rightright = i;}}else{//说明已经有切割图了,下面我们进行切割处理if ((left > 0 || right > 0)){Crop corp = new Crop(new Rectangle(left, 0, right - left + 1, b.Height));var small = corp.Apply(b);//居中,将图片放在20*50的像素里面list.Add(small);}left = right = 0;}}return list;}/// <summary>/// 按照 X 轴线 切割/// </summary>/// <param name="b"></param>/// <returns></returns>public List<Bitmap> Crop_X(List<Bitmap> list){var corplist = new List<Bitmap>();//再对分割的图进行上下切割,取出上下的白边foreach (var segb in list){//统计每一行的“1”的个数,方便切除int[] rows = new int[segb.Height];/**  横向切割*/for (int y = 0; y < segb.Height; y++){for (int x = 0; x < segb.Width; x++){//获取当前像素点像素var pixel = segb.GetPixel(x, y);//说明是黑色点if (pixel.R == 0){rows[y] = ++rows[y];}}}int bottom = 0, top = 0;for (int y = 0; y < rows.Length; y++){//说明该行有像素值(为了防止像素干扰,去噪后出现空白的问题,所以多判断一下,防止切割成多个)if (rows[y] > 0 || (y + 1 < rows.Length && rows[y + 1] > 0)){if (top == 0){//切下来图片的top坐标top = y;}else{//切下来图片的bottom坐标bottom = y;}}else{//说明已经有切割图了,下面我们进行切割处理if ((top > 0 || bottom > 0) && bottom - top > 0){Crop corp = new Crop(new Rectangle(0, top, segb.Width, bottom - top + 1));var small = corp.Apply(segb);corplist.Add(small);}top = bottom = 0;}}}return corplist;}

<5> 图片精处理

这里要注意的是,比如数字 “2”,切除上下左右的空白后,再加上噪点的干扰,不一定每次切下来的图片大小都一样,所以这里为了方便更好的识别,我们需要重置下图片的大小,并且将 “数字2” 进行文字居中。


/// <summary>/// 重置图片的指定大小并且居中/// </summary>/// <param name="list"></param>/// <returns></returns>public List<Bitmap> ToResizeAndCenterIt(List<Bitmap> list, int w = 20, int h = 20){List<Bitmap> resizeList = new List<Bitmap>();for (int i = 0; i < list.Count; i++){//反转一下图片list[i] = new Invert().Apply(list[i]);int sw = list[i].Width;int sh = list[i].Height;Crop corpFilter = new Crop(new Rectangle(0, 0, w, h));list[i] = corpFilter.Apply(list[i]);//再反转回去list[i] = new Invert().Apply(list[i]);//计算中心位置int centerX = (w - sw) / 2;int centerY = (h - sh) / 2;list[i] = new CanvasMove(new IntPoint(centerX, centerY), Color.White).Apply(list[i]);resizeList.Add(list[i]);}return resizeList;}

其实精处理后,这些图片就可以作为我们的模板库的图片了,可以将每张模板图都标记下具体的数字,后续我们再遇到时,计算下其相似度就可以了,下面就是已经制作好的模板。

<6> 模板匹配识别

既然模板图片都制作好了,一切都差不多水到渠成了,下次需要识别的验证码我都切好后做成精图片再跟模板进行匹配,在 afroge 里面有一个 ExhaustiveTemplateMatching,专门用来进行模板匹配用的,很方便。


ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.9f);

这里的 0.9f 就是设定的阈值,只有大于0.9,我才认为该模板与目标图片相似,然后在所有大于0.9的相似度中取到最大的一个作为我们最后识别的图像。


var files = Directory.GetFiles(Environment.CurrentDirectory + "\\Template\\");var templateList = files.Select(i => { return new Bitmap(i); }).ToList();var templateListFileName = files.Select(i => { return i.Substring(30, 1); }).ToList();var result = new List<string>();ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.9f);//这里面有四张图片,进行四张图的模板匹配for (int i = 0; i < list.Count; i++){float max = 0;int index = 0;for (int j = 0; j < templateList.Count; j++){var compare = templateMatching.ProcessImage(list[i], templateList[j]);if (compare.Length > 0 && compare[0].Similarity > max){//记录下最相似的max = compare[0].Similarity;index = j;}}result.Add(templateListFileName[index]);}

最后的效果还是不错的,识别率基本 100% 吧。

这篇关于用 aforge.net 小试一下验证码识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297670

相关文章

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服