最近幾天比較空閒,於是也模仿網上的文章搞了搞驗證碼識別,當然是那些工整,規則,無碼,無干擾,灰常純淨與單純的驗證碼....
當然也看了下網上找到的複雜的驗證碼(車牌號)識別資料,無奈做為乙個半路出家,江湖四流的程式設計師,面對那麼多數學公式只能做罷,一直以自己英語不好而痛心疾首,今天又認識到數學更是障礙, 記的前陣只有人說乙個英語不好的程式設計師能走多遠,現在我知道,乙個英語不好但是數學很好的程式設計師能走很遠,比英語好但數學不好的程式設計師要遠多了,哎....
步驟1.獲取驗證碼
2.灰度化與二值化
3.切割
4.建立特徵庫(這裡使用每個畫素二值化後的0,1字串)
5.使用特徵庫來識別
1.獲取:
2.灰度化:
首先解釋下所謂的黑白。其實更準確地應該叫256級灰度圖。當乙個顏色點的r=g=b時,就是我們所謂的「灰色」。由於rgb的取值範圍在[0,255],所以一共只有256種可能。
所以彩色轉為黑白的原理非常簡單。只要掃瞄彩圖的每一點,讓輸出圖對應點的r=g=b就成了。現在問題的關鍵就是如何取值了。
一般有兩種,一種是彩圖rgb三分量的算數平均值,另一種是加權平均值。加權平均是考慮到人類眼睛對不同分量的敏感程度。
**1(使用指標)
/**
/// 變成黑白圖
///
/// 原始圖
/// 模式。0:加權平均 1:算數平均
///
private bitmap togray(bitmap bmp,int mode)
int w = bmp.width;
int h = bmp.height;
tryelse // 算數平均
p[0] = newcolor;
p[1] = newcolor;
p[2] = newcolor;
p += 3;
}p += srcdata.stride - w * 3;
}bmp.unlockbits(srcdata);
return bmp;}}
catch
**二:
使用bitmap的 getpixel與setpixel ,驗證碼都是小,畫素不多因此一般應用速度可以接受
public void graybypixels(bitmap bmp)}}
3.切割:
**1: 找出最左,最上,最右,最下的四個有效果點,按照這個矩形切割
///
/// 得到有效圖形,圖形由外面傳入
///
/// 灰度背景分界值
/// 有效字元數
///
public bitmap getpicvalidbyvalue(bitmap singlepic, int dggrayvalue);};
};//複製新圖
rectangle clonerect = new rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);
return singlepic.clone(clonerect, singlepic.pixelformat);
}固定切割比較簡單,使用bitmap.clone 就可以完成,具體檢視clone的函式宣告
4.建立特徵庫:這裡使用矩陣來記錄
///
/// 返回灰度的點陣描述字串,1表示灰點,0表示背景
///
/// 灰度圖
/// 背前景灰色界限
///
public static string getsinglebmpcode(bitmap singlepic, int dggrayvalue)
return code;
}最後每個切割出來的都會得出 011000111.... 這樣的字串,按0~9的順序分別建立特徵庫即可
看這個驗證碼:
這個好象是動易早年asp產品中的乙個驗證碼,其中的4個數字多是固定出現的,是40x10(畫素),每個數字站10x10個畫素,不過上面加入了少量的干擾畫素,干擾畫素很少最多一次刷出了6個點, 另外這些噪音很難去處,因為數字本身的畫素就很稀薄,用網上找的"中值濾波"什麼的一搞數字就沒了,再考慮單獨出現的畫素基本在1,2個點,其他4,5個點都連在數字上,那麼對比乙個無干擾的數字段(10x10 ---100個畫素),有干擾點所造成的畫素差異應該在6%以內, 後來又對比了全部無干擾數字段的(0,1,2.....9等標準數字) 畫素二值化後的0,1字串,發現他們之間最接進的是 3,跟8,字串中有93%的位是一樣的, 基於上面分析於是選擇94%作為分界點,將採集到的二值化後的字串跟標準庫中的字串進行對比,如果兩者有94%(這裡就是94個畫素)相同就當這兩個是一樣的.
參考:車牌識別及驗證碼識別的一般思路
c# 處理之:彩色轉為黑白圖
用於驗證碼識別的類(c#原始碼)
驗證碼 簡單驗證碼識別
這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...
簡單驗證碼識別
最近幾天比較空閒,於是也模仿網上的文章搞了搞驗證碼識別,當然是那些工整,規則,無碼,無干擾,灰常純淨與單純的驗證碼.當然也看了下網上找到的複雜的驗證碼 車牌號 識別資料,無奈做為乙個半路出家,江湖四流的程式設計師,面對那麼多數學公式只能做罷,一直以自己英語不好而痛心疾首,今天又認識到數學更是障礙,記...
Python簡單驗證碼識別
本例項只能識別簡單的字元驗證碼,可以用於執行簡單的自動化測試場景。安裝tesseract ocr tesseract ocr的版本與語言包的版本必須對應 安裝庫pip install wheel pip install tesserocr 2.2.2 cp36 cp36m win amd64.whl...