在這一篇中將講驗證碼識別,也就是我們要實現自動化處理的部分。有了前面的知識,這一部分將會變得很容易,下面先說下具體的流程,如下圖所示:
1. 將樣本庫載入到記憶體
首先需要再回顧下樣本庫的格式,如下:
}
上面的**又定義了兩個新的類,codelist類和database類。codelist是由一系列codestruct所組成,這些codestruct擁有共同的字元。而database是由長度為36的字元陣列所構成。36代表字元的個數,這些字元的定義如下:實際上在驗證碼生成的過程中,數字0和字母o由於太過接近,無法區分,這兩個字元都不會出現在驗證碼中。public static readonly string charactertable =
;
2. 字元匹配
從上面的**可以看到,字元匹配其實就是對字元掃瞄所生成的碼陣列進行匹配,這裡預設兩個碼陣列有相同的長度,也就是在影象中為相同的寬度。匹配就是對兩個陣列中的碼(ulong型別)做異或運算。異或運算的規則是相同為0,相反為1.因此可以統計異或運算結果中1的個數,就可以得到不匹配的畫素個數了。這裡統計1的個數採用下面的方法,執行效率比較高。/// /// to improve the effcience, add a colomn threshold,
/// if one colomn is small than this threshold, return 0
///
///
///
///
///
public static double matchtwocodes(ulong code1, ulong code2)
return 1.0 - count / total;
}
另外給出一種常規的方法,以作比較:/// /// swift aglorthim
///
/// 這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。
/// 如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。
/// 其原理是不斷清除n的二進位制表示中最右邊的1,同時累加計數器,直至n為0
///
/// 舉個例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),
/// 清除了8最右邊的1(其實就是最高位的1,因為8的二進位制中只有乙個1)。
/// 再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),
/// 清除了7的二進位制表示中最右邊的1
///
///
///
public static int bitcount(ulong n)
return c ;
}
3. 總體流程/// /// 任意給定乙個32位無符號整數n,求n的二進位制表示中1的個數,
/// 比如n = 5(0101)時,返回2,n = 15(1111)時,返回4
///
///
///
public static int bitcount(uint n)
return c ;
}
注意到在上面的**中定義了乙個hashtable用來儲存匹配結果大於閾值(0.95)的結果。而如果匹配率大於0.99,則認為是完美匹配,立刻結束迴圈,這樣可以提高程式執行效率。這個hashtable的鍵和值分別為中字元左邊界的列數和匹配的結果。這麼做是因為這裡閾值不能太過嚴格,否則會有很多字元無法與樣本庫匹配。而如果閾值不高,就會有多個結果滿足條件。我們需要對匹配的結果進行進一步的刪減。刪減的原理為如果下乙個匹配結果的列數遇上乙個相差10以上,就認為是下乙個字元,否則認為是同乙個字元。private void button16_click(object sender, eventargs e)
if (matchrate >= tools.matchratethreshold_perfectmatch) // 0.99}}
}temp.dispose();
}bm.dispose();
// 對匹配結果進行刪減
listresultlist = tools.sorthashtable(table);
if (resultlist.count == 4)
else
messagebox.show("couldn't match!!!");}}
public static listsorthashtable(hashtable ht)
}return rtn;
}
驗證碼 簡單驗證碼識別
這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...
C 下的驗證碼識別
引言 演算法分析 驗證碼識別原理及 演示 for int i 0 i bmpobj.height i 遍歷高度 灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將...
C 下的驗證碼識別
轉 引言 演算法分析 驗證碼識別原理及 演示 c sharp view plain copy print?灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2...