当前位置:文档之家› 图像识别解决方案(验证码)

图像识别解决方案(验证码)

图像识别解决方案(验证码) 篇一:用于验证码图片识别的类用于验证码图片识别的类(C#源码)最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。

但写得多了,也总结出不少相同之处。

今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。

好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。

封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:GrayByPixels(); //灰度处理GetPicValidByValue(128, 4); //得到有效空间Bitmap[] pics = GetSplitPics(4, 1); //分割string code = GetSingleBmpCode(pics[i], 128);//得到代码串usingSystem;using;usingusing;using;using;using;namespace BallotAiying2{classUnCodebase{publicBitmap bmpobj;publicUnCodebase(Bitmap pic){bmpobj = new Bitmap(pic); //转换为Format32bppRgb////// 根据RGB,计算灰度值////// Color值/// 灰度值,整型private intGetGrayNumColor( posClr){return ( * 19595 + * 38469 + posClr .B * 7472) >> 16;}////// 灰度转换,逐点方式///public voidGrayByPixels(){for (inti = 0; i {for (intj = 0; j {inttmpValue = GetGrayNumColor((j, i));(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue)); }}}////// 去图形边框//////public void ClearPicBorder(intborderWidth){for (inti = 0; i {for (intj = 0; j {if (i - 1 - borderWidth|| i > - 1 - borderWidth)(j, i, Color.FromArgb(255, 255, 255));}}}////// 灰度转换,逐行方式///public voidGrayByLine(){Rectangle rec = newRectangle(0, 0, , );BitmapData bmpData = (rec, , ); // );// = ;IntPtr scan0 = ;intlen = * ;int[] pixels = new int [len];(scan0, pixels, 0, len);//对图片进行处理intGrayValue = 0;for (inti = 0; i {GrayValue = GetGrayNumColor(Color.FromArgb(pixels[i]));pixels[i] = (byte)((GrayValue, GrayValue, GrayValue)).ToArgb(); //Color转byte}(bmpData);}////// 得到有效图形并调整为可平均分割的大小////// 灰度背景分界值/// 有效字符数///public void GetPicValidByValue(int dgGrayValue,intCharsCount){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i {for (intj = 0; j {intpixelValue = (j, i).R;if (pixelValue {if(posx1 > j) posx1 = j;if(posy1 > i) posy1 = i;if(posx2 if(posy2 };};// 确保能整除int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount; //可整除的差额数if(Span {int leftSpan = Span / 2; //分配到左边的空列,如span为单数,则右边比左边大1 if(posx1 > leftSpan)posx1 = posx1 - leftSpan;if(posx2 + Span - leftSpan posx2 = posx2 + Span - leftSpan;}//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2- posy1 + 1);bmpobj = (cloneRect, );}/// 得到有效图形,图形为类变量////// 灰度背景分界值/// 有效字符数///public void GetPicValidByValue(int dgGrayValue){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i {for (intj = 0; j {intpixelValue = (j, i).R;if (pixelValue {if(posx1 > j) posx1 = j;if(posy1 > i) posy1 = i;if(posx2 if(posy2 };};};//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2- posy1 + 1);bmpobj = (cloneRect, );}////// 得到有效图形,图形由外面传入////// 灰度背景分界值/// 有效字符数///public Bitmap GetPicValidByValue(Bitmap singlepic, intdgGrayValue){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i { for (intj = 0; j {intpixelValue = (j, i).R;if (pixelValue {if(posx1 > j) posx1 = j;if(posy1 > i) posy1 = i;if(posx2 if(posy2 };};};//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2- posy1 + 1);return(cloneRect, );}////// 平均分割图片////// 水平上分割数/// 垂直上分割数/// 分割好的图片数组public Bitmap [] GetSplitPics(int RowNum,intColNum){if(RowNum == 0 || ColNum == 0)return null;intsingW = / RowNum;intsingH = / ColNum;Bitmap [] PicArray=newBitmap[RowNum*ColNum];Rectangle cloneRect;for (int i = 0; i {篇二:验证码图像识别基础类最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。

但写得多了,也总结出不少相同之处。

今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。

好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。

封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:GrayByPixels(); //灰度处理GetPicValidByValue(128, 4); //得到有效空间Bitmap[] pics = GetSplitPics(4, 1); //分割string code = GetSingleBmpCode(pics[i], 128); //得到代码串 usingSystem;using;using ; using;using ;using;using;namespaceBallotAiying2{class UnCodebase{public Bitmap bmpobj;publicUnCodebase(Bitmap pic){bmpobj = new Bitmap(pic); //转换为Format32bppRgb }/**/////// 根据RGB,计算灰度值////// Color值/// 灰度值,整型private intGetGrayNumColor( posClr){return ( * 19595 + * 38469 + * 7472) >> 16; }/**/////// 灰度转换,逐点方式///public voidGrayByPixels(){for (inti = 0; i {for (intj = 0; j {int tmpValue = GetGrayNumColor((j, i)); (j, i, (tmpValue, tmpValue, tmpV alue));}}}/**/////// 去图形边框//////public void ClearPicBorder(intborderWidth){for (inti = 0; i {for (intj = 0; j {if (i - 1 - borderWidth || i > - 1 - borderWidth)(j, i, (255, 255, 255));}}}/**/////// 灰度转换,逐行方式///public voidGrayByLine(){Rectangle rec = new Rectangle(0, 0, , );BitmapData bmpData = (rec, , );// Argb);//= ;IntPtr scan0 = ;intlen = * ;int[] pixels = new int[len];(scan0, pixels, 0, len);//对图片进行处理int GrayValue = 0;for (inti = 0; i {GrayValue = GetGrayNumColor((pixels[i]));pixels[i] = (byte)((GrayValue, GrayValue, GrayValue)).ToArgb();//Color转byte}(bmpData);}/**/////// 得到有效图形并调整为可平均分割的大小////// 灰度背景分界值/// 有效字符数///public void GetPicValidByValue(int dgGrayValue, intCharsCount){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i {for (intj = 0; j {int pixelValue = (j, i).R;if (pixelValue {if (posx1 > j) posx1 = j;if (posy1 > i) posy1 = i;if(posx2 if(posy2 };};};// 确保能整除int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount;//可整除的差额数if (Span ount){int leftSpan = Span / 2; //分配到左边的空列,如span为单数,则右边比左边大1 if(posx1 > leftSpan)posx1 = posx1 - leftSpan;if(posx2 + Span - leftSpan posx2 = posx2 + Span - leftSpan;}//复制新图Rectangle cloneRect = newRectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);bmpobj = (cloneRect, );}/**/////// 得到有效图形,图形为类变量////// 灰度背景分界值/// 有效字符数///public void GetPicValidByValue(int dgGrayV alue){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i {for (intj = 0; j {int pixelValue = (j, i).R;if (pixelValue {if (posx1 > j) posx1 = j;if(posy1 > i) posy1 = i;if (posx2 if(posy2 };};};//复制新图Rectangle cloneRect = newRectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);bmpobj = (cloneRect, );}/**/////// 得到有效图形,图形由外面传入////// 灰度背景分界值/// 有效字符数///public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue){int posx1 = ; intposy1 = ;int posx2 = 0; intposy2 = 0;for (int i = 0; i {for (int j = 0; j dth; j++){int pixelValue = (j, i).R;if (pixelValue {if(posx1 > j) posx1 = j;if(posy1 > i) posy1 = i;if (posx2 if(posy2 };};};//复制新图Rectangle cloneRect = newRectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); return (cloneRect, );篇三:数字图像__验证码识别一、数字图像处理基础一幅图像可以定义为一个二维数组f(x,y),这里x,y 是空间坐标,而在任何一对空间坐标(x,y)上的幅值f称为该点图像的强度或灰度。

相关主题