最近做一個小玩意需要識別驗證碼,之前從來沒有接觸過識別驗證碼這塊,這可難倒了我。所以,在網上搜索如何識別驗證碼,許多前輩寫的博文教會了我。怕以后又忘記了,故此寫篇隨筆記錄。
我要識別的驗證碼是一種非常簡單,如圖:
識別步驟:
1、圖片灰度化(把彩色的驗證碼圖片轉換成灰色的圖片)、圖片二值化
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++) //雙重循環,遍歷驗證碼圖片的像素點
{
Color color = bmp.GetPixel(i, j); //取位圖某點顏色
int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11); //灰度化
if (gray * 0.2125 + gray * 0.7154 + gray * 0.0721 >= v) //二值化,v為閾值,大于等于閾值的設為白色,否者設為黑色
{
bmp.SetPixel(i, j, Color.FromArgb(255, 255, 255));
}
else
{
bmp.SetPixel(i, j, Color.FromArgb(0, 0, 0));
}
}
}
經過圖片灰度化的處理,圖片就成這樣子:
經過圖片二值化的處理,圖片就成這樣子:
2、圖片分割(把四個數字分割出來,保存像素點代碼)
把原來的整個驗證碼圖片按照固定的寬、高分割出來(我是按左邊距6像素,頂邊距4像素,間隔4像素,寬9像素,高12像素分割)。然后取出各個數字圖片的像素色,255輸出1,其他輸出0。就得到108(9*12)個0,1了。
111111111111111000000111100000000001001111111100011111111110001111111100100000000001111000000111111111111111
保存完所有數字(0-9)的0,1代碼之后,以后就直接與這9串0,1模糊匹配(有雜色的可能,所以要模糊匹配),然后就實現了自動識別驗證碼。