图像识别解决方案验证码工作范文.docx
- 文档编号:29166192
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:15
- 大小:18.09KB
图像识别解决方案验证码工作范文.docx
《图像识别解决方案验证码工作范文.docx》由会员分享,可在线阅读,更多相关《图像识别解决方案验证码工作范文.docx(15页珍藏版)》请在冰豆网上搜索。
图像识别解决方案验证码工作范文
图像识别解决方案(验证码)
篇一:
用于验证码图片识别的类
用于验证码图片识别的类(C#源码)
最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。
但写得多了,也总结出不少相同之处。
今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。
好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。
封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:
GrayByPixels;//灰度处理
GetPicValidByValue;//得到有效空间
Bitmap[]pics=GetSplitPics;//分割
stringcode=GetSingleBmpCode;//得到代码串
using
System;
using
;
using
;
using
;
using
;
using
;
using
;
namespaceBallotAiying2
{
class
UnCodebase
{
public
Bitmapbmpobj;
public
UnCodebase
{
bmpobj=newBitmap;//转换为
Format32bppRgb
}
///
///根据RGB,计算灰度值
///
///
Color值
///灰度值,整型
privateint
GetGrayNumColor
{
return>>16;
}
///
///灰度转换,逐点方式
///
publicvoid
GrayByPixels
{
for
{
for
{
int
tmpValue=GetGrayNumColor);
);
}
}
}
///
///去图形边框
///
///
publicvoidClearPicBorder
{
for
{
for
{
if
);
}
}
}
///
///灰度转换,逐行方式
///
publicvoid
GrayByLine
{
Rectanglerec=new
Rectangle;
BitmapDatabmpData=;
//);
//=;
IntPtrscan0=;
int
len=*;
int[]pixels=newint
[len];
;
//对图片进行处理
int
GrayValue=0;
for
{
GrayValue=GetGrayNumColor);
pixels[i]=).ToArgb;//Color转
byte
}
;
}
///
///得到有效图形并调整为可平均分割的大小
///
///
灰度背景分界值
///
有效字符数
///
publicvoidGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
int
pixelValue=.R;
if//根据灰度值
{
if
posx1=j;
if
posy1=i;
if
posx2=j;
if
posy2=i;
};
};
};
//确保能整除
intSpan=CharsCount-%CharsCount;//可整除的差额数
if
{
intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大
1if
posx1=posx1-leftSpan;
if
posx2=posx2+Span-leftSpan;
}
//复制新图
RectanglecloneRect=newRectangle;
bmpobj=;
}
///
///得到有效图形,图形为类变量
///
///
灰度背景分界值
///
有效字符数
///
publicvoidGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
int
pixelValue=.R;
if//根据灰度值
{
if
posx1=j;
if
posy1=i;
if
posx2=j;
if
posy2=i;
};
};
};
//复制新图
RectanglecloneRect=newRectangle;
bmpobj=;
}
///
///得到有效图形,图形由外面传入
///
///
灰度背景分界值
///
有效字符数
///
publicBitmapGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
int
pixelValue=.R;
if//根据灰度值
{
if
posx1=j;
if
posy1=i;
if
posx2=j;
if
posy2=i;
};
};
};
//复制新图
RectanglecloneRect=newRectangle;
return
;
}
///
///平均分割图片
///
///
水平上分割数
///
垂直上分割数
///分割好的图片数组
publicBitmap[]GetSplitPics
{
if
returnnull
;
int
singW=/RowNum;
int
singH=/ColNum;
Bitmap[]PicArray=new
Bitmap[RowNum*ColNum];
RectanglecloneRect;
for//找有效区
{
篇二:
验证码图像识别基础类
最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。
但写得多了,也总结出不少相同之处。
今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。
好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。
封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:
GrayByPixels;//灰度处理
GetPicValidByValue;//得到有效空间
Bitmap[]pics=GetSplitPics;//分割
stringcode=GetSingleBmpCode;//得到代码串using
System;
using
;
using;using
;
using;
using
;
using
;
namespace
BallotAiying2
{
classUnCodebase
{
publicBitmapbmpobj;
public
UnCodebase
{
bmpobj=newBitmap;//转换为Format32bppRgb
}
/**////
///根据RGB,计算灰度值
///
///
Color值
///灰度值,整型
privateint
GetGrayNumColor
{
return>>16;
}
/**////
///灰度转换,逐点方式
///
publicvoid
GrayByPixels
{
for
{
for
{
inttmpV
alue=GetGrayNumColor);
);
}
}
}
/**////
///去图形边框
///
///
publicvoidClearPicBorder
{
for
{
for
{
if
);
}
}
}
/**////
///灰度转换,逐行方式
///
publicvoid
GrayByLine
{
Rectanglerec=newRectangle;
BitmapDatabmpData=;//
Argb);
//
=;
IntPtrscan0=;
int
len=*;
int[]pixels=newint
[len];
;
//对图片进行处理
intGrayV
alue=0;
for
{
GrayV
alue=GetGrayNumColor);
pixels[i]=).ToArgb;//Color转
byte
}
;
}
/**////
///得到有效图形并调整为可平均分割的大小
///
///
灰度背景分界值
///
有效字符数
///
publicvoidGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
intpixelV
alue=.R;
if//根据灰度值
{
ifposx1=j;
ifposy1=i;
if
posx2=j;
if
posy2=i;
};
};
};
//确保能整除
intSpan=CharsCount-%CharsCount;//可整除的差额数
if
{
intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大
1if
posx1=posx1-leftSpan;
if
posx2=posx2+Span-leftSpan;
}
//复制新图
RectanglecloneRect=new
Rectangle;
bmpobj=;
}
/**////
///得到有效图形,图形为类变量
///
///
灰度背景分界值
///
有效字符数
///
publicvoidGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
intpixelV
alue=.R;
if//根据灰度值
{
ifposx1=j;
if
posy1=i;
ifposx2=j;
if
posy2=i;
};
};
};
//复制新图
RectanglecloneRect=new
Rectangle;
bmpobj=;
}
/**////
///得到有效图形,图形由外面传入
///
///
灰度背景分界值
///
有效字符数
///
publicBitmapGetPicValidByValue
{
intposx1=;int
posy1=;
intposx2=0;int
posy2=0;
for//找有效区
{
for
{
intpixelV
alue=.R;
if//根据灰度值
{
if
posx1=j;
if
posy1=i;
ifposx2=j;
if
posy2=i;
};
};
};
//复制新图
RectanglecloneRect=new
Rectangle;return;
篇三:
数字图像__验证码识别
一、数字图像处理基础
一幅图像可以定义为一个二维数组f,这里x,y是空间坐标,而在任何一对空间坐标上的幅值f称为该点图像的强度或灰度。
当x,y和幅值f为有限的、离散的数值时,称该图像为数字图像。
自然界呈现在人眼中的图像是连续的模拟信号,在计算机处理前,必须用图像传感器把光信号转换为表示亮度的电信号,再通过取样和量化得到一副数字图像。
取样是对图像在坐标上进行离散化的过程,每一个取样点称为一个像素。
量化是对图像灰度上的离散化过程。
取样后将得到M*N个像素,每个像素量化得到一个灰度值L,以L表示灰度值的允许取值范围,则数字图像存储需要的比特数b可以表示为:
图像的灰度值取值范围被称为图像的动态范围。
把占有灰度级全部有效段的图像称为高动态范围图像,高动态范围图像有较高的对比度。
相反,地动态范围的图像看上去是冲淡了的灰暗格调。
二、图像的预处理:
主要是对图像进行灰度化、二值化、抑噪(滤波)等技术。
1、图像的灰度化
RGB系统中一个颜色值由3个分量组成,这样的图像称为彩色图像,RGB系统称为颜色空间模型。
常见的颜色空间模型还有HSI、CMYK等。
如果一幅图像的颜色空间是一维的
(一个颜色值只有一个颜色分
量),则这幅图像就是一副灰度图。
在位图图像中,一般以R=G=B来显示灰度图像。
图1原始图片
常用的灰度化方法有以下三种:
其中,公式()的方法于I色彩空间中I分量的计算公式,公式()于NTSC色彩空间中Y分量的计算公式。
公式()是基于采用保留最小亮度(黑色)的方法。
图2用公式灰度化后的图片
RGB彩色图像可以看成是由3副单色的灰度图像构成的,可以直接取RGB通道中的任一个通道得到灰度化图像,如,前提是图像中目标像素的亮度信息主要分布在B通道上,否则灰度化结果将是亮度信息的大量丢失。
灰度图像又叫亮度图像,由归一化的取值表示亮度,最大取值表示白色,最小取值表示黑色。
以P表示图像中一个点,x、y分别是图像的横坐标和纵坐标,R表示R通道的颜色分量,G表示G通道的颜色分量,B表示B通道的颜色分量。
点P的亮度值用L表示。
彩色图像的亮度没有严格的定义和计算公式,一般用公式()来计算,我们记作L1。
同样的用公式()计算的亮度值记作L2,用公式()计算的亮度值记作L3。
可以证明:
()
()
公式()取RGB通道的平均值,得到的图像相对比较柔和,同时也缩小了目标和背景的平均亮度差,不利于后续的阀值处理。
公式()考虑了人眼对绿色的适应度最强,蓝色次之,红色最差。
在处理绿色调和蓝色调的验证码图像时,公式()的效果令人满意,但在处理红色调的图像时,因为公式中红色的权值很小,灰度化后目标像素和背景像素的亮度差值被严重缩小,效果还不如公式()。
公式()基于一个前提,那就是有限保留目标像素的亮度信息,利于后续的阀值分割。
需要说明的是,要根据图像灰度化的目的不同,原图色彩特征的不同,选择合适的灰度化方法。
2、图像的二值化
一般24位RGB图像的灰度图是8位256个灰度级的,如果把这个灰度级减少到1位2个灰度级,就得到一副二值图,二值图像中的
数据全部是0或1。
图3二值化后图像
三、字符分割:
字符分割包括从验证码图像中分割出字符区域和把字符区域划分成单个字符两个部分。
如果采用统计特征匹配以及神经网络法识别,必须要先分割出单个的字符。
简单的分割方法包括等距分割、积分投影分割、交叉点分割、求连通区等。
其中,粘连字符的分割是一个难点,复杂的粘连情况下分割比较困难,是一个硬人工智能问题。
四、字符识别
字符识别就是把处理后的图片还原回字符文本的过程。
可以分成基于字符分割的识别(包括采用神经网络、SVM、各种统计距离的识别法)和模板匹配法识别。
字符识别的常用做法是:
先获取该字符的特征码,然后使用各种分类算法将对该特征码进行分类,将其打上相应的类标签。
分类模型的训练,是对字符库中的每个字符进行特征化处理,得到每个字符的特征码,该字符的标签就是该字符本身,利用特征码加上字符的标签对字符库中的所有数据进行训练,得到相应的分类模型。
当然,得到了待识别字符的特征码后。
也可以使用相似性度量和
字符库中的字符的特征码进行比较,将该字符识别为与其特征码相似性最高的字符。
现在的问题就集中在如何获取字符的特征码。
文章[2]中介绍了一种简单的获取特征码的方法:
对于二值化后的图像进行分割,分割出来的图像是一个个的字符,如下图所示:
图4对图像进行分割,确定每个图像的边界
在每个字符的边界内,按行(或列)扫描该图片,检测其中的每个像素点,如果像素为白色则为0,如果像素为黑色则为1,将这些0和1连起来组成的字符串就构成了该字符图片的特征码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 识别 解决方案 验证 工作 范文