欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#识别出图片里的数字和字母

程序员文章站 2023-12-09 19:59:45
一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现的字母和数字基本就那几个,所以识...

一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现的字母和数字基本就那几个,所以识别库的范围设定的比较少。

原理和算法在代码中做了详细说明,功能存在很大的局限性,但我的想法是把这个思路和实现的办法共享出来。

源码下载地址:

C#识别出图片里的数字和字母

/*
 * 开发思路:图片灰度处理,二进制,然后和图片中的字二进制库精确对比
 * 
 * 获取字库:通过下面代码中generatelicense(bitmap singlepic)方法获得,具体操作:
 *   从图片中截图出(抠出)一个字符,然后处理得到二维的二进制矩阵,比如下面的字符1对应的二维矩阵
 *   00000
 *   00100
 *   11100
 *   00100
 *   00100
 *   00100
 *   00100
 *   00100
 *   00100
 *   11111
 *   00000
 *   00000
 *   
 * 注意:【相同字符,比如1,不同字体,字号,不同缩放大小的图片,获得到的二位矩阵中0、1排列和数量都是不同的!
 *     故按照此方法来写出匹配所有字的话,那字库就大了。。。】
 * 
 * 
*/
/// <summary>
/// 提取出该图片内的字符(将进过灰度处理的图片转化为0、1的二位数组)
/// </summary>
/// <param name="singlepic">图片来源</param>
public void generatelicense(bitmap singlepic)
{
  try
  {
    char[,] chararray = new char[singlepic.height, singlepic.width];  //定义个chai型的二维数组记录每个像素上0/1的值,形成一个矩形
    int imagewidth = 0;  //记录图片的像素宽度
    int imageheight = 0;  //记录图片的像素高度
    int dggrayvalue = 128;  //灰度值
    color piexl;
    //string code = "";  //存储每个像素的0/1
    for (int posy = 0; posy < singlepic.height; posy++)
    {//从上到下
      string codecache = "";  //存储每行的像素的0/1
      for (int posx = 0; posx < singlepic.width; posx++)
      {//从左到右
        piexl = singlepic.getpixel(posx, posy);
        if (piexl.r < dggrayvalue)  
        {// 如果该像素的颜色为黑色,值就为“1”
          codecache = codecache + "1";
        }
        else
        {// 否则该像素的颜色为白色,值就为“0”
          codecache = codecache + "0";              
        }
      }
      char[] array = codecache.tochararray();  //每行的0/1的值用数字保存,以便于进行循环处理
      //code += codecache + "\n";
      for (imagewidth = 0; imagewidth < array.length; imagewidth++)
        chararray[imageheight, imagewidth] = array[imagewidth];  //通过循环将每行值转存到二维数组中
      imageheight++;
    }    //*********************以上代码可用来获取一个字的图片二进制数组,即字库*****************************
 
    //开始和字库进行匹配(我的工具中只需要下面的几个字符)
    findword(chararray, char0, imageheight, imagewidth, binarywidth0, binaryheight0, '0');
    findword(chararray, char1, imageheight, imagewidth, binarywidth1, binaryheight1, '1');
    findword(chararray, char2, imageheight, imagewidth, binarywidth2, binaryheight2, '2');
    findword(chararray, char3, imageheight, imagewidth, binarywidth3, binaryheight3, '3');
    findword(chararray, char4, imageheight, imagewidth, binarywidth4, binaryheight4, '4');
    findword(chararray, char5, imageheight, imagewidth, binarywidth5, binaryheight5, '5');
    findword(chararray, char6, imageheight, imagewidth, binarywidth6, binaryheight6, '6');
    findword(chararray, char7, imageheight, imagewidth, binarywidth7, binaryheight7, '7');
    findword(chararray, char8, imageheight, imagewidth, binarywidth8, binaryheight8, '8');
    findword(chararray, char9, imageheight, imagewidth, binarywidth9, binaryheight9, '9');
    findword(chararray, chara, imageheight, imagewidth, binarywidtha, binaryheighta, 'a');
    findword(chararray, charb, imageheight, imagewidth, binarywidthb, binaryheightb, 'b');
    findword(chararray, charc, imageheight, imagewidth, binarywidthc, binaryheightc, 'c');
    findword(chararray, chard, imageheight, imagewidth, binarywidthd, binaryheightd, 'd');
    findword(chararray, chare, imageheight, imagewidth, binarywidthe, binaryheighte, 'e');
    findword(chararray, charf, imageheight, imagewidth, binarywidthf, binaryheightf, 'f');
    findword(chararray, charp, imageheight, imagewidth, binarywidthp, binaryheightp, 'p');
    findword(chararray, chary, imageheight, imagewidth, binarywidthy, binaryheighty, 'y');
    //------------------------------------end---------------------------------------------
    richtextboxlicense.text += identifysort();  //执行identifysort方法,将我需要的格式在richtextboxlicense文本框中显示
    richtextboxlicense.selectionstart = richtextboxlicense.textlength;  //将光标移到最后面
  }
  catch { }
}

C#识别出图片里的数字和字母

以上所述就是本文的全部内容了,希望大家能够喜欢。