第一遍文章可以入門
第一部份 圖檔的組成及特征碼的定義
做為驗證碼的識别,那我們首先需要了解的就是基本的原理,這裡就是先說清楚這個原理,再往後大家看代碼就比較容易明白了(其實本來就比較簡單,我說這麼多就是為了大家看完不說我的水準次罷了。再次爆汗~!)
正題了,其實整個驗證碼的識别的話我們先得分解一個圖,每一個圖形其實都是由每一個點和每一個點來組成的,說到每個點其實就是一個色塊,當每一個色塊拼接起來就成了一個圖形,這個雖然說有點廢話,但我還是提一下。
需要更好的了解我們來看圖:
圖一

圖二
通過上面的兩幅圖檔我們就能很清楚的知道色塊情況了,每一個小塊就是一個色塊,有些用白色來表示,而整個圖的點則也是通過坐标來識别的,X,Y兩個點,這樣我們就不難厘清行和列了,當我們取色塊X1,Y1就是指取出第一行,第一列,如果我們取色塊為X2,Y5則是指第五行,第二個色塊。呵呵!
色塊了解了,我們可以通過取色塊中的顔色來做為一個比較和判斷的識别标準。我們對一個圖中的數字進行取色,當顔色的值為黑色(0)時,我們将點記錄為1,當所取的點值為白色(255)時,我們将點記錄為0。這樣整張圖取下來,我們就會得到一個字元串,格式如下:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111100001111111111111111001100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011001111111111111111000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000
上面的這段類似二進制的字元串就是我們從圖一中提出來的東西了,我們稱這一個字元串為這張圖檔的特征碼。這個特征的解讀我們利用前面所說的知識來自己解讀一下,以圖一為參考,圖一中的前面的四列都是白色,是以我們的特征碼中開始好多個零。>_<
從第五列開始,除了前面的兩格是白色,接下來就是黑色了,這樣我們開始數一下,就是應該有82個零,然後開始是1,嘿嘿~~~大家可以數一下。接着就開始到了黑色部份了,這裡應該有11個黑色塊,在我們的特征碼中有11個1。這樣的話大家就很清楚,這個特征碼的結構了。
好,現在對圖檔的解讀我們已經很清楚了,接着就是用代碼來實作了。未完待續(用代碼實作特征碼提取)
第二部份 使用代碼實作提取圖檔中的特征碼
上一章中我們說了圖檔組成及特征碼的定義,不懂的請看第一部份。下面我們直接開始第二部份,我們這一章中将使用C#寫一個Winform的程式來提取圖檔中的特征碼。
在這一章裡我們的重點部份有3點
1、
Bitmap中的Bitmap.GetPixel(x,y) //這裡是讀取圖檔中的點中的顔色
注意:需要使用Bitmap的話我們則需要引用兩個命名空間,分别為:
using System.Drawing;
using System.Drawing.Imaging;
2、圖檔中取了第個點,但一個點中的色彩是由R.G.B三個色組成,是以我們需要知道R.G.B的顔色,這裡我們例程中的圖檔比較單一,而且文字是黑色的文字,黑色的RGB的色值為(255.255.255)是以,我們隻需要取R值就行了,如果是文字中是多種顔色組成的話,最好用photoshop改成灰階,再進行取值,這樣得到的特征碼會比較準确。
3、取色值的時候使用到了循環嵌套,一個取行值,一個取列值,圖檔中每一個點都需要掃描到,最後就是注意“環保”,用完了要把圖檔關閉。(*_*)
好了,知道了需要使用什麼東西我們就開始寫代碼了。
代碼比較多,是以我就隻在這裡放重要部份的代碼,而多餘部份的代碼大家自己下源程看吧,源程我會放在附件中,源程中盡量使用簡單的代碼,沒有使用類,沒有使用工廠模式,這樣容易看得懂,但是卻不是好的代碼,是以大家如果自己做的話注意這個問題。
//載入圖檔
Bitmap bmp = new Bitmap(drawing);
//每行每列掃描擷取圖檔數字編碼字元
string CodeNumber = ""; //定義一個字元串變量用于存儲特征碼
//對圖進行逐點掃描,當R值不等于255時則将CodeNumber記為0,否則記為1
for (int x = 0; x < bmp.Width; x++) //行掃描,由x.0至x.圖檔寬度
{
for (int y = 0; y < bmp.Height; y++) //列掃描,由y.0至圖檔高度
{
if (bmp.GetPixel(x, y).R == 0) //對圖檔中的點進行判斷,當x,y點中的R色為0的時候
{
CodeNumber = CodeNumber + "1"; //記錄為1
}
else //否則
CodeNumber = CodeNumber + "0"; //記錄為0
}
}
}
//關閉圖檔
bmp.Dispose();
//将特征碼顯示在richTextBox1控件中顯示出來
richTextBox1.Text = CodeNumber;
每行都有注釋,多餘的我就不說了。程式完成以後,我們将特征碼記錄下來。在後順我們制作驗證碼識别器的時候需要使用。(未完待續 下一章,使用特征碼制作驗證碼識别器)
第三章 驗證碼識别器的制作
上一章我們說了特征碼及特征碼的提取,現在我們所需要的就是通過特征碼來實作驗證碼的識别,其實聰明的朋友已經猜到了,這個驗證碼的識别到了這裡就很明白了,沒什麼特别的就是将第每個色塊提到的特征碼進行對比,識别過程就是一個對比的過程。呵呵~~~我其實上就是為了再混個精華貼。好了,和上章一樣,我這裡給的代碼比較少,需要詳細代碼的朋友直接下源程看吧,我的源程中注釋都不少,應該比較容易能看懂,在這個例子中我的注釋就不那麼多了,因為重點和上個例子差不多。
本章重點:
1、使用上一章所制作的提取器,提取無雜情況下圖檔的特征碼,并将0~9,單獨數字的特征碼儲存,在這裡程式開始的時候使用一個字元串數字,将每個特征碼都做儲存。格式如下:
string[] Features;
Features = new string[10];
Features[0] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111100001111111111111111001100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011110000000000000000111100000000000000001111000000000000000011001111111111111111000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000";
Features[1] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000011001100000000000000110011000000000000001100110000000000000011111111111111111111111111111111111111111100000000000000000011000000000000000000110000000000000000001100000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
…………
2、注意圖檔中色塊的RGB的色值。如果需要讀取的驗證碼的圖形的背景色中的色塊的R值為多少及圖檔中文字中的色塊的R值是多少,這個可以通過PHOTOSHOP或是其它的螢幕取色軟體來實作。
3、注意圖檔的長度和高度,上面提取的驗證碼是每一個單數字的長度及高度,而在這裡是需要這整張圖檔的長度是多少,高度是多少,必需切成一個一個的數字進行驗證。現在我們示列中的圖檔的總長度是120,其中包涵着6個數字,我們所提取的特征碼為20*20,也就是說總長度必需分為6份,每單數字的高度為20,長度為20,循環6次就能得到整張圖檔。
4、注意你圖檔中的誤差,如果無雜點的情況下那麼你的誤差點可以為0,如果有雜點的情況下就需要判斷你的數字的誤差點與特征碼中的誤差數量是多少。這樣才能更好的做出判斷。也能提高準确率。
好了,上面就是這一章的重點,現在我們開始繼續我們的程式。
首先我們要做就是先将特征碼做做成一個字元串數組,在上面已經給出了,這裡就不重複給出了,接着我們需要的就是載入圖檔,這裡所載入的圖檔是需要識别的驗證碼的圖檔。然後我們對這個圖檔進行讀取,而這裡所讀取的不是整張圖檔,而是将圖檔分成20*20的範圍來讀取,每讀出一個20*20的範圍就進行一次判斷。使用一個循環就可以弄好了。如果不清楚的話一會自己看附件中的源程就能明白。
做好讀取圖檔中的特征碼以後就是對我們圖檔中的特征碼進行對比,首先是字元串的長度對比,當字元串的長度不相等的時候就不用判斷了,因為這是不可能正确的,跳過,不能識别。-_-!!!
當驗證碼的長度相同,就開始判斷兩個字元串是否完全相等,如果完全相等的情況下就直接輸出數字,說明這個數字無雜,除了背景以外,其它的都完全相同。
如果字元串的長度相等,而字元串又不相等的時候我們就将字元串拆成字元串數組,一個一個的特征碼進行比較,出現不相同的情況的時候就将錯誤點進行記錄,這些錯誤點就是我們所說的誤差點,最後做完整個循環判斷以後如果錯誤點小于我們所設定的誤差點的情況下,則等于此數,否則進入下一次的循環,當所有的特征碼都進行對比,沒有得到我們所需要的結果時,這個點将不能誤别,繼續跳過。
QQ:519841366
本頁版權歸作者和部落格園所有,歡迎轉載,但未經作者同意必須保留此段聲明,
且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利