[TOC]

基础知识积累

网络上的知识:

  • C# 验证码识别、图片二值化、分割、分类、识别

    作者介绍了他自己写的一个软件,并且将实现过程说了出来,整体还是收获比较大的。几个关键的概念。图片二值化,就是讲图像上的像素点的灰度值设置为0或255。

    //将代码手写一遍,加深记忆
    public Bitmap binaryZation(){
        for(int x = 0;x<img.width;x++){
            for(int y = 0; y< img.height ;y++){
                _c = img.GetPixel(x,y);
                //灰度值
                int _tc = (_c.R+_c.G+_c.B)/3;
                // 大于阈值,设为黑色
                if(_tc>t){
                    img.setPixel(x,y,Color.FromArgb(_c.A,b,b,b));
                }else{
                    img.setPixel(x,y,Color.FromArgb(_c.A,w,w,w));
                }
            }
        }
        return img;
    }


    二值化后需要判断图片的黑白比例,如果黑色比白色多,需要对图片进行反色处理。接下来是图片分割,判断每一个竖行是否是纯白色行,不是的话记录当前X坐标,然后每一横行判断是否是纯白行,这样就能找到每一个数字的区域。

    //分割图片
    public Bitmap cutImg(){
        cutY();
        //区域个数
        _count = 0;
        if(xlist.Count > 1){
            int _start = xlist[0];
            int _end = xlist[xlist.count -1 ];
            int _idx = 0;
            while(_start != _end){
                // 区域宽度
                int _w = _start ;
                _count++;
                while(xlist.contains(_w) && _idx <xlist.count){
                    _w++;
                    _idx++;
                }
                // 区域X轴坐标
                int x = _start ;
                int y = 0;
                int width = _w -_start;
                int height = img.height;
                // x轴分割当前区域
                cutX(img.Clone(new Rectangle(x,y,width,height),img.PixelFormat));
                if(ylist.count > 1) && ylist.count != img.height){
                    int y1 = YList[0];
                    int y2 = YList[YList.Count - 1];
                    if (y1 != 1)
                    {
              }
              height = y2 - y1 + 1;
          }
           Graphics g = Graphics.FromImage(img);
          g.SmoothingMode = SmoothingMode.HighQuality;
          g.CompositingMode = CompositingMode.SourceOver;
          g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
          g.InterpolationMode = InterpolationMode.HighQualityBicubic;
          //画出验证码区域
          g.DrawRectangle(new Pen(Brushes.Green), new Rectangle(x, y, width, height));
          g.Dispose();
          //起始值指向下一组
          if (__idx < XList.Count)
          {
              __start = XList[__idx];
          }
          else
          {
              __start = __end;
          }

       }
   return img;

}

#region Y轴字符分割图片

      /// <summary>
      /// 得到Y轴分割点
      /// 判断每一竖行是否有黑色
      /// 有则添加
      /// </summary>
      /// <param name="img">要验证的图片</param>
      private void CutY()
      {
          XList.Clear();
          for (int x = 0; x < img.Width; x++)
          {
              isWhilteLine = false;
              for (int y = 0; y < img.Height; y++)
              {
                  __c = img.GetPixel(x, y);
                  if (__c.R == w)
                  {
                      isWhilteLine = true;
                  }
                  else
                  {
                      isWhilteLine = false;
                      break;
                  }
              }
              if (!isWhilteLine)
              {
                  XList.Add(x);
              }
          }
      }
      #endregion

      #region X轴字符分割图片
      /// <summary>
      /// 得到X轴分割点
      /// 判断每一横行是否有黑色
      /// 有则添加
      /// </summary>
      /// <param name="tempImg">临时区域</param>
      private void CutX(Bitmap tempImg)
      {
          YList.Clear();
          for (int x = 0; x < tempImg.Height; x++)
          {
              isWhilteLine = false;
              for (int y = 0; y < tempImg.Width; y++)
              {
                  __c = tempImg.GetPixel(y, x);
                  if (__c.R == w)
                  {
                      isWhilteLine = true;
                  }
                  else
                  {
                      isWhilteLine = false;
                      break;
                  }
              }
              if (!isWhilteLine)
              {
                  YList.Add(x);
              }
          }
          tempImg.Dispose();
      }
      #endregion

<br>

- [C#识别简单的验证码][https://blog.csdn.net/louislong007/article/details/47377063]

这篇文章更加详细,也可以阅读

- [验证码识别实践][https://blog.csdn.net/stevenkylelee/article/details/8263890]

- [零OCR基础6行代码实现C#验证码识别][https://www.cnblogs.com/263613093/p/5076146.html]

- [验证码识别实践1:自己动手C#实现](https://blog.csdn.net/StevenKyleLee/article/details/8263890)

#### 动手去做