C#識(shí)別出圖片里的數(shù)字和字母
一個(gè)圖片識(shí)別小工具,原先主要是識(shí)別以前公司的軟件注冊(cè)碼截圖里的數(shù)字和字母(每次要一個(gè)一個(gè)框復(fù)制出來(lái)粘貼到注冊(cè)器里,很麻煩?。?,因?yàn)樽?cè)碼出現(xiàn)的字母和數(shù)字基本就那幾個(gè),所以識(shí)別庫(kù)的范圍設(shè)定的比較少。
原理和算法在代碼中做了詳細(xì)說(shuō)明,功能存在很大的局限性,但我的想法是把這個(gè)思路和實(shí)現(xiàn)的辦法共享出來(lái)。
源碼下載地址:
http://git.oschina.net/bobo2cj/iamge2text

/*
* 開(kāi)發(fā)思路:圖片灰度處理,二進(jìn)制,然后和圖片中的字二進(jìn)制庫(kù)精確對(duì)比
*
* 獲取字庫(kù):通過(guò)下面代碼中g(shù)enerateLicense(Bitmap singlepic)方法獲得,具體操作:
* 從圖片中截圖出(摳出)一個(gè)字符,然后處理得到二維的二進(jìn)制矩陣,比如下面的字符1對(duì)應(yīng)的二維矩陣
* 00000
* 00100
* 11100
* 00100
* 00100
* 00100
* 00100
* 00100
* 00100
* 11111
* 00000
* 00000
*
* 注意:【相同字符,比如1,不同字體,字號(hào),不同縮放大小的圖片,獲得到的二位矩陣中0、1排列和數(shù)量都是不同的!
* 故按照此方法來(lái)寫(xiě)出匹配所有字的話,那字庫(kù)就大了。。。】
*
*
*/
/// <summary>
/// 提取出該圖片內(nèi)的字符(將進(jìn)過(guò)灰度處理的圖片轉(zhuǎn)化為0、1的二位數(shù)組)
/// </summary>
/// <param name="singlepic">圖片來(lái)源</param>
public void generateLicense(Bitmap singlepic)
{
try
{
char[,] charArray = new char[singlepic.Height, singlepic.Width]; //定義個(gè)chai型的二維數(shù)組記錄每個(gè)像素上0/1的值,形成一個(gè)矩形
int imageWidth = 0; //記錄圖片的像素寬度
int imageHeight = 0; //記錄圖片的像素高度
int dgGrayValue = 128; //灰度值
Color piexl;
//string code = ""; //存儲(chǔ)每個(gè)像素的0/1
for (int posy = 0; posy < singlepic.Height; posy++)
{//從上到下
string codeCache = ""; //存儲(chǔ)每行的像素的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的值用數(shù)字保存,以便于進(jìn)行循環(huán)處理
//code += codeCache + "\n";
for (imageWidth = 0; imageWidth < array.Length; imageWidth++)
charArray[imageHeight, imageWidth] = array[imageWidth]; //通過(guò)循環(huán)將每行值轉(zhuǎn)存到二維數(shù)組中
imageHeight++;
} //*********************以上代碼可用來(lái)獲取一個(gè)字的圖片二進(jìn)制數(shù)組,即字庫(kù)*****************************
//開(kāi)始和字庫(kù)進(jìn)行匹配(我的工具中只需要下面的幾個(gè)字符)
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(); //執(zhí)行identifySort方法,將我需要的格式在richTextBoxLicense文本框中顯示
richTextBoxLicense.SelectionStart = richTextBoxLicense.TextLength; //將光標(biāo)移到最后面
}
catch { }
}

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C#利用iTextSharp組件給PDF文檔添加圖片/文字水印
這篇文章主要給大家介紹了關(guān)于如何C#利用iTextSharp組件給PDF文檔添加圖片/文字水印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法
這篇文章主要介紹了C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法,需要的朋友可以參考下2014-07-07
C# Windows API應(yīng)用之基于FlashWindowEx實(shí)現(xiàn)窗口閃爍的方法
這篇文章主要介紹了C# Windows API應(yīng)用之基于FlashWindowEx實(shí)現(xiàn)窗口閃爍的方法,結(jié)合實(shí)例形式分析了Windows API函數(shù)FlashWindowEx的功能、定義及實(shí)現(xiàn)窗口閃爍的相關(guān)技巧,需要的朋友可以參考下2016-08-08

