首页 > 编程 > C# > 正文

c#实现识别图片上的验证码数字

2019-10-29 21:36:27
字体:
来源:转载
供稿:网友

这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下。

c#实现识别图片上的验证码数字

 

 
  1. public void imgdo(Bitmap img) 
  2. //去色 
  3. Bitmap btp = img; 
  4. Color c = new Color(); 
  5. int rr, gg, bb; 
  6. for (int i = 0; i < btp.Width; i++) 
  7. for (int j = 0; j < btp.Height; j++) 
  8. //取图片当前的像素点 
  9. c = btp.GetPixel(i, j); 
  10. rr = c.R; gg = c.G; bb = c.B; 
  11. //改变颜色 
  12. if (rr == 102 && gg == 0 && bb == 0) 
  13. //重新设置当前的像素点 
  14. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  15. if (rr == 153 && gg == 0 && bb == 0) 
  16. //重新设置当前的像素点 
  17. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  18. if (rr == 153 && gg == 0 && bb == 51) 
  19. //重新设置当前的像素点 
  20. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  21. if (rr == 153 && gg == 43 && bb == 51) 
  22. //重新设置当前的像素点 
  23. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  24. if (rr == 255 && gg == 255 && bb == 0) 
  25. //重新设置当前的像素点 
  26. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  27. if (rr == 255 && gg == 255 && bb == 51) 
  28. //重新设置当前的像素点 
  29. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  30. btp.Save("d://去除相关颜色.png"); 
  31.  
  32. pictureBox2.Image = Image.FromFile("d://去除相关颜色.png"); 
  33.  
  34.  
  35. //灰度 
  36. Bitmap bmphd = btp; 
  37. for (int i = 0; i < bmphd.Width; i++) 
  38. for (int j = 0; j < bmphd.Height; j++) 
  39. //取图片当前的像素点 
  40. var color = bmphd.GetPixel(i, j); 
  41.  
  42. var gray = (int)(color.R * 0.001 + color.G * 0.700 + color.B * 0.250); 
  43.  
  44. //重新设置当前的像素点 
  45. bmphd.SetPixel(i, j, Color.FromArgb(gray, gray, gray)); 
  46. bmphd.Save("d://灰度.png"); 
  47. pictureBox27.Image = Image.FromFile("d://灰度.png"); 
  48.  
  49.  
  50. //二值化 
  51. Bitmap erzhi = bmphd; 
  52. Bitmap orcbmp; 
  53. int nn = 3; 
  54. int w = erzhi.Width; 
  55. int h = erzhi.Height; 
  56. BitmapData data = erzhi.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
  57. unsafe 
  58. byte* p = (byte*)data.Scan0; 
  59. byte[,] vSource = new byte[w, h]; 
  60. int offset = data.Stride - w * nn; 
  61.  
  62. for (int y = 0; y < h; y++) 
  63. for (int x = 0; x < w; x++) 
  64. vSource[x, y] = (byte)(((int)p[0] + (int)p[1] + (int)p[2]) / 3); 
  65. p += nn; 
  66. p += offset; 
  67. erzhi.UnlockBits(data); 
  68.  
  69. Bitmap bmpDest = new Bitmap(w, h, PixelFormat.Format24bppRgb); 
  70. BitmapData dataDest = bmpDest.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); 
  71. p = (byte*)dataDest.Scan0; 
  72. offset = dataDest.Stride - w * nn; 
  73. for (int y = 0; y < h; y++) 
  74. for (int x = 0; x < w; x++) 
  75. p[0] = p[1] = p[2] = (int)vSource[x, y] > 161 ? (byte)255 : (byte)0; 
  76. //p[0] = p[1] = p[2] = (int)GetAverageColor(vSource, x, y, w, h) > 50 ? (byte)255 : (byte)0; 
  77. p += nn; 
  78.  
  79. p += offset; 
  80. bmpDest.UnlockBits(dataDest); 
  81.  
  82. orcbmp = bmpDest; 
  83. orcbmp.Save("d://二值化.png"); 
  84. pictureBox29.Image = Image.FromFile("d://二值化.png"); 
  85.  
  86. //OCR的值 
  87. if (orcbmp != null
  88. string result = Ocr(orcbmp); 
  89. label32.Text = result.Replace("/n""/r/n").Replace(" """); 
  90.  

C#识别验证码图片通用类

 

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4. using System.Collections; 
  5. using System.Drawing; 
  6. using System.Drawing.Imaging; 
  7. using System.Runtime.InteropServices; 
  8.  
  9. namespace BallotAiying2 
  10. class UnCodebase 
  11. public Bitmap bmpobj; 
  12. public UnCodebase(Bitmap pic) 
  13. bmpobj = new Bitmap(pic); //转换为Format32bppRgb 
  14.  
  15. /// <summary> 
  16. /// 根据RGB,计算灰度值 
  17. /// </summary> 
  18. /// <param name="posClr">Color值</param> 
  19. /// <returns>灰度值,整型</returns> 
  20. private int GetGrayNumColor(System.Drawing.Color posClr) 
  21. return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16; 
  22.  
  23. /// <summary> 
  24. /// 灰度转换,逐点方式 
  25. /// </summary> 
  26. public void GrayByPixels() 
  27. for (int i = 0; i < bmpobj.Height; i++) 
  28. for (int j = 0; j < bmpobj.Width; j++) 
  29. int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i)); 
  30. bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue)); 
  31.  
  32. /// <summary> 
  33. /// 去图形边框 
  34. /// </summary> 
  35. /// <param name="borderWidth"></param> 
  36. public void ClearPicBorder(int borderWidth) 
  37. for (int i = 0; i < bmpobj.Height; i++) 
  38. for (int j = 0; j < bmpobj.Width; j++) 
  39. if (i < borderWidth || j < borderWidth || j > bmpobj.Width - 1 - borderWidth || i > bmpobj.Height - 1 - borderWidth) 
  40. bmpobj.SetPixel(j, i, Color.FromArgb(255, 255, 255)); 
  41.  
  42. /// <summary> 
  43. /// 灰度转换,逐行方式 
  44. /// </summary> 
  45. public void GrayByLine() 
  46. Rectangle rec = new Rectangle(0, 0, bmpobj.Width, bmpobj.Height); 
  47. BitmapData bmpData = bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);// PixelFormat.Format32bppPArgb); 
  48. // bmpData.PixelFormat = PixelFormat.Format24bppRgb; 
  49. IntPtr scan0 = bmpData.Scan0; 
  50. int len = bmpobj.Width * bmpobj.Height; 
  51. int[] pixels = new int[len]; 
  52. Marshal.Copy(scan0, pixels, 0, len); 
  53.  
  54. //对图片进行处理 
  55. int GrayValue = 0; 
  56. for (int i = 0; i < len; i++) 
  57. GrayValue = GetGrayNumColor(Color.FromArgb(pixels)); 
  58. pixels = (byte)(Color.FromArgb(GrayValue, GrayValue, GrayValue)).ToArgb(); //Color转byte 
  59.  
  60. bmpobj.UnlockBits(bmpData); 
  61.  
  62. /// <summary> 
  63. /// 得到有效图形并调整为可平均分割的大小 
  64. /// </summary> 
  65. /// <param name="dgGrayValue">灰度背景分界值</param> 
  66. /// <param name="CharsCount">有效字符数</param> 
  67. /// <returns></returns> 
  68. public void GetPicValidByValue(int dgGrayValue, int CharsCount) 
  69. int posx1 = bmpobj.Width; int posy1 = bmpobj.Height; 
  70. int posx2 = 0; int posy2 = 0; 
  71. for (int i = 0; i < bmpobj.Height; i++) //找有效区 
  72. for (int j = 0; j < bmpobj.Width; j++) 
  73. int pixelValue = bmpobj.GetPixel(j, i).R; 
  74. if (pixelValue < dgGrayValue) //根据灰度值 
  75. if (posx1 > j) posx1 = j; 
  76. if (posy1 > i) posy1 = i; 
  77.  
  78. if (posx2 < j) posx2 = j; 
  79. if (posy2 < i) posy2 = i; 
  80. }; 
  81. }; 
  82. }; 
  83. // 确保能整除 
  84. int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount; //可整除的差额数 
  85. if (Span < CharsCount) 
  86. int leftSpan = Span / 2; //分配到左边的空列 ,如span为单数,则右边比左边大1 
  87. if (posx1 > leftSpan) 
  88. posx1 = posx1 - leftSpan; 
  89. if (posx2 + Span - leftSpan < bmpobj.Width) 
  90. posx2 = posx2 + Span - leftSpan; 
  91. //复制新图 
  92. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  93. bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat); 
  94.  
  95. /// <summary> 
  96. /// 得到有效图形,图形为类变量 
  97. /// </summary> 
  98. /// <param name="dgGrayValue">灰度背景分界值</param> 
  99. /// <param name="CharsCount">有效字符数</param> 
  100. /// <returns></returns> 
  101. public void GetPicValidByValue(int dgGrayValue) 
  102. int posx1 = bmpobj.Width; int posy1 = bmpobj.Height; 
  103. int posx2 = 0; int posy2 = 0; 
  104. for (int i = 0; i < bmpobj.Height; i++) //找有效区 
  105. for (int j = 0; j < bmpobj.Width; j++) 
  106. int pixelValue = bmpobj.GetPixel(j, i).R; 
  107. if (pixelValue < dgGrayValue) //根据灰度值 
  108. if (posx1 > j) posx1 = j; 
  109. if (posy1 > i) posy1 = i; 
  110.  
  111. if (posx2 < j) posx2 = j; 
  112. if (posy2 < i) posy2 = i; 
  113. }; 
  114. }; 
  115. }; 
  116. //复制新图 
  117. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  118. bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat); 
  119.  
  120. /// <summary> 
  121. /// 得到有效图形,图形由外面传入 
  122. /// </summary> 
  123. /// <param name="dgGrayValue">灰度背景分界值</param> 
  124. /// <param name="CharsCount">有效字符数</param> 
  125. /// <returns></returns> 
  126. public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue) 
  127. int posx1 = singlepic.Width; int posy1 = singlepic.Height; 
  128. int posx2 = 0; int posy2 = 0; 
  129. for (int i = 0; i < singlepic.Height; i++) //找有效区 
  130. for (int j = 0; j < singlepic.Width; j++) 
  131. int pixelValue = singlepic.GetPixel(j, i).R; 
  132. if (pixelValue < dgGrayValue) //根据灰度值 
  133. if (posx1 > j) posx1 = j; 
  134. if (posy1 > i) posy1 = i; 
  135.  
  136. if (posx2 < j) posx2 = j; 
  137. if (posy2 < i) posy2 = i; 
  138. }; 
  139. }; 
  140. }; 
  141. //复制新图 
  142. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  143. return singlepic.Clone(cloneRect, singlepic.PixelFormat); 
  144.  
  145. /// <summary> 
  146. /// 平均分割图片 
  147. /// </summary> 
  148. /// <param name="RowNum">水平上分割数</param> 
  149. /// <param name="ColNum">垂直上分割数</param> 
  150. /// <returns>分割好的图片数组</returns> 
  151. public Bitmap [] GetSplitPics(int RowNum,int ColNum) 
  152. if (RowNum == 0 || ColNum == 0) 
  153. return null
  154. int singW = bmpobj.Width / RowNum; 
  155. int singH = bmpobj.Height / ColNum; 
  156. Bitmap [] PicArray=new Bitmap[RowNum*ColNum]; 
  157.  
  158. Rectangle cloneRect; 
  159. for (int i = 0; i < ColNum; i++) //找有效区 
  160. for (int j = 0; j < RowNum; j++) 
  161. cloneRect = new Rectangle(j*singW, i*singH, singW , singH); 
  162. PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//复制小块图 
  163. return PicArray; 
  164.  
  165. /// <summary> 
  166. /// 返回灰度图片的点阵描述字串,1表示灰点,0表示背景 
  167. /// </summary> 
  168. /// <param name="singlepic">灰度图</param> 
  169. /// <param name="dgGrayValue">背前景灰色界限</param> 
  170. /// <returns></returns> 
  171. public string GetSingleBmpCode(Bitmap singlepic, int dgGrayValue) 
  172. Color piexl; 
  173. string code = ""
  174. for (int posy = 0; posy < singlepic.Height; posy++) 
  175. for (int posx = 0; posx < singlepic.Width; posx++) 
  176. piexl = singlepic.GetPixel(posx, posy); 
  177. if (piexl.R < dgGrayValue) // Color.Black ) 
  178. code = code + "1"
  179. else 
  180. code = code + "0"
  181. return code; 

以上2则都是使用C#实现的orc识别的代码,希望对大家学习C#有所帮助。


注:相关教程知识阅读请移步到c#教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表