《2022年验证码识别算法知识 .pdf》由会员分享,可在线阅读,更多相关《2022年验证码识别算法知识 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。但写得多了,也总结出不少相同之处。今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:GrayByPixels(); /灰度处理GetPicValidByValue(128, 4); /得到有效空间Bitmap pics = GetSplitPics(4, 1); / 分割string code = G
2、etSingleBmpCode(picsi, 128); / 得到代码串具体使用,请参见我做的例子:投票程序示例.exe投票程序源码(例子说明:使用进程投票,可自动清除Alert弹出窗口,可自动换IP,ADSL用户自行修改 Restart.bat中第三行内容)using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.Inte
3、ropServices; namespace BallotAiying2 class UnCodebase public Bitmap bmpobj; public UnCodebase(Bitmap pic) bmpobj = new Bitmap(pic); / 转换为 Format32bppRgb /根据 RGB ,计算灰度值/Color值/灰度值,整型privateint GetGrayNumColor(System.Drawing.Color posClr) return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472)
4、16; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - /灰度转换 ,逐点方式/publicvoid 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,
5、 Color.FromArgb(tmpValue, tmpValue, tmpValue); /去图形边框/publicvoid ClearPicBorder(int borderWidth) for ( int i = 0; i bmpobj.Height; i+) for ( int j = 0; j bmpobj.Width; j+) if (i borderWidth | j bmpobj.Width - 1 - borderWidth | i bmpobj.Height - 1 - borderWidth) bmpobj.SetPixel(j, i, Color.FromArgb(2
6、55, 255, 255); /灰度转换 ,逐行方式/publicvoid GrayByLine() Rectangle rec = new Rectangle(0, 0, bmpobj.Width, bmpobj.Height); BitmapData bmpData = bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);/ PixelFormat.Format32bppPArgb); / bmpData.PixelFormat = PixelFormat.Format24bppRgb; IntPtr scan
7、0 = bmpData.Scan0; int len = bmpobj.Width * bmpobj.Height; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - int pixels = newint len; Marshal.Copy(scan0, pixels, 0, len); / 对图片进行处理int GrayValue = 0; for ( int i = 0; i len; i+) GrayValue = Get
8、GrayNumColor(Color.FromArgb(pixelsi); pixelsi = (byte )(Color.FromArgb(GrayValue, GrayValue, GrayValue).ToArgb(); /Color转 byte bmpobj.UnlockBits(bmpData); /得到有效图形并调整为可平均分割的大小/灰度背景分界值/有效字符数 /publicvoid GetPicValidByValue(int dgGrayValue, int CharsCount) int posx1 = bmpobj.Width; int posy1 = bmpobj.He
9、ight; int posx2 = 0; int posy2 = 0; for ( int i = 0; i bmpobj.Height; i+) / 找有效区 for ( int j = 0; j bmpobj.Width; j+) int pixelValue = bmpobj.GetPixel(j, i).R; if (pixelValue j) posx1 = j; if (posy1 i) posy1 = i; if (posx2 j) posx2 = j; if (posy2 i) posy2 = i; ; ; ; / 确保能整除int Span = CharsCount - (p
10、osx2 - posx1 + 1) % CharsCount; / 可整除的差额数if (Span leftSpan) posx1 = posx1 - leftSpan; if (posx2 + Span - leftSpan bmpobj.Width) posx2 = posx2 + Span - leftSpan; / 复制新图 Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); bmpobj = bmpobj.Clone(cloneRect, bmpobj.Pix
11、elFormat); /得到有效图形,图形为类变量/灰度背景分界值/有效字符数 /publicvoid GetPicValidByValue(int dgGrayValue) int posx1 = bmpobj.Width; int posy1 = bmpobj.Height; int posx2 = 0; int posy2 = 0; for ( int i = 0; i bmpobj.Height; i+) / 找有效区 for ( int j = 0; j bmpobj.Width; j+) int pixelValue = bmpobj.GetPixel(j, i).R; if (p
12、ixelValue j) posx1 = j; if (posy1 i) posy1 = i; if (posx2 j) posx2 = j; if (posy2 i) posy2 = i; ; ; ; / 复制新图 Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
13、 - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - /得到有效图形,图形由外面传入/灰度背景分界值/有效字符数 /public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue) int posx1 = singlepic.Width; int posy1 = singlepic.Height; int posx2 = 0; int posy2 = 0; for ( int i = 0; i singlepic.Height; i+) / 找有效区 for
14、( int j = 0; j singlepic.Width; j+) int pixelValue = singlepic.GetPixel(j, i).R; if (pixelValue j) posx1 = j; if (posy1 i) posy1 = i; if (posx2 j) posx2 = j; if (posy2 i) posy2 = i; ; ; ; / 复制新图 Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); return singlepic
15、.Clone(cloneRect, singlepic.PixelFormat); /平均分割图片/水平上分割数/垂直上分割数/分割好的图片数组public Bitmap GetSplitPics(int RowNum,int ColNum) if (RowNum = 0 | ColNum = 0) returnnull ; int singW = bmpobj.Width / RowNum; int singH = bmpobj.Height / ColNum; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
16、 - - - - - - 第 5 页,共 6 页 - - - - - - - - - Bitmap PicArray=new BitmapRowNum*ColNum; Rectangle cloneRect; for ( int i = 0; i ColNum; i+) / 找有效区 for ( int j = 0; j RowNum; j+) cloneRect = new Rectangle(j*singW, i*singH, singW , singH); PicArrayi*RowNum+j=bmpobj.Clone(cloneRect, bmpobj.PixelFormat);/ 复
17、制小块图 return PicArray; /返回灰度图片的点阵描述字串,1 表示灰点, 0 表示背景/灰度图 /背前景灰色界限/publicstring GetSingleBmpCode(Bitmap singlepic, int dgGrayValue) Color piexl; string code = ; for ( int posy = 0; posy singlepic.Height; posy+) for ( int posx = 0; posx singlepic.Width; posx+) piexl = singlepic.GetPixel(posx, posy); if (piexl.R dgGrayValue) / Color.Black ) code = code + 1; else code = code + 0; return code; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -