簡單驗證碼識別

2021-05-21 23:46:51 字數 2825 閱讀 7594

最近幾天比較空閒,於是也模仿網上的文章搞了搞驗證碼識別,當然是那些工整,規則,無碼,無干擾,灰常純淨與單純的驗證碼....

當然也看了下網上找到的複雜的驗證碼(車牌號)識別資料,無奈做為乙個半路出家,江湖四流的程式設計師,面對那麼多數學公式只能做罷,一直以自己英語不好而痛心疾首,今天又認識到數學更是障礙, 記的前陣只有人說乙個英語不好的程式設計師能走多遠,現在我知道,乙個英語不好但是數學很好的程式設計師能走很遠,比英語好但數學不好的程式設計師要遠多了,哎....

步驟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...