驗證碼識別(C )

2021-05-22 21:52:51 字數 3670 閱讀 9136

1、如何設前景/背景的分界值

uncodebase類中有乙個getpicvalidbyvalue( int dggrayvalue) 函式,可以得到前景的有效區域,常有人問我

前景/背景的分界值dggrayvalue是如何確定的(常用的是灰度128)。這個值的獲取是有數學演算法,叫最大類間方差法,即影象的前後景的平方差為最大時的值就是我們關心的分界值,對付如

這樣較複雜的背景非常管用,下面是具體的c#**。

/// 

/// 得到灰度影象前景背景的臨界值 最大類間方差法,yuanbao,2007.08

/// 

/// 前景背景的臨界值

public int getdggrayvalue()

}//直方圖平滑化

for (k = 0; k <= 255; k++)

pixelnum[k] = (int)((float)total / 5.0 + 0.5);    //平滑化,左邊2個+中間1個+右邊2個灰度,共5個,所以總和除以5,後面加0.5是用修正值

}//求閾值

sum = csum = 0.0;

n = 0;

//計算總的圖象的點數和質量矩,為後面的計算做準備

for (k = 0; k <= 255; k++)

fmax = -1.0;                          //類間方差sb不可能為負,所以fmax初始值為-1不影響計算的進行

n1 = 0;

for (k = 0; k 

//沒有分出前景後景

n2 = n - n1;                        //n2為背景圖象的點數

if (n2 == 0)                //n2為0表示全部都是後景圖象,與n1=0情況類似,之後的遍歷不可能使前景點數增加,所以此時可以退出迴圈

csum += (double)k * pixelnum[k];    //前景的「灰度的值*其點數」的總和

m1 = csum / n1;                     //m1為前景的平均灰度

m2 = (sum - csum) / n2;               //m2為背景的平均灰度

sb = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2);   //sb為類間方差

if (sb > fmax)                  //如果算出的類間方差大於前一次算出的類間方差

}return threshvalue;}

2、如何去除干擾點/干擾線

2.1 干擾點/干擾線的特徵分析

現在網上的大多數的驗證碼都是加了干擾的,一般分為干擾點和干擾線,如下圖。標用1、2、3的分別為點、線、字元。

去干擾,一般是逐點分析,這三種情況下,每一點及周邊8個點的情況都不一樣(分別為1點,3點,8點),這是一種干擾資訊的粒度比字元的粒度小的典型情況。現在就可以動手編寫去雜**了。

2.2 根據周邊有效點數去噪函式

/// 

///  去掉雜點(適合雜點/雜線粗為1)

/// 

/// 背前景灰色界限

/// 

public void clearnoise(int dggrayvalue, int maxnearpoints)

else

if (neardots 

bmpobj.setpixel(i, j, color.fromargb(255, 255, 255));   //去掉單點 && 粗細小3鄰邊點

}else  //背景

bmpobj.setpixel(i, j, color.fromargb(255, 255, 255));}}

2.3 濾波演算法去噪函式

影象預處理中有多種濾波演算法,其原理與方法分別為

1) 中值濾波

它通過從影象中的某個取樣視窗取出奇數個資料進行排序得到的結果。顧名思義,所謂中值就是視窗中奇數個資料按大小順序排列後處於中心位置的那個數。中值濾波以視窗的中值作為處理結果。

實現起來很簡單

1:先對視窗排序

2:用排序後的中值取代要處理的資料即可

注意事項:

1:注意影象邊緣資料的處理

2:對於不同的目的選用不同的窗體,一般有3×3,5×5等等

/// 

/// 3×3中值濾波除雜,yuanbao,2007.10

/// 

/// 

public void clearnoise(int dggrayvalue)}}

//      if (bmpobj.getpixel(x, y).r 

bmpobj.setpixel(x, y, color.fromargb(p[4], p[4], p[4]));    //給有效值付中值}}

}    經過實際執行證實,中值濾波能有效去除影象中的雜訊點,特別是在一片連續變化緩和的區域中(比如人的衣服,**),幾乎100%去除灰度突變點(可以認為是雜訊點),也因為如此,中值濾波不適合用在一些細節多,如細節點,細節線多的影象中,因為細節點有可能被當成雜訊點去除。

中值濾波的視窗還可以有多種形狀,上面程式選擇的是矩形(容易計算),其實視窗還可以是菱形,圓形,十字形等等,不同的視窗形狀有不同的濾波效果,對有緩慢且有較長輪廓線的物體適合用矩形或者原型視窗,對於有尖頂角物體的影象適合採用十字形視窗。

中值濾波可以進行線性組合,不同視窗形狀的濾波器可以線性組合

改進中值濾波方法:

對一些內容複雜的影象,可以使用複合型中值濾波。如, 中值濾波線性組合、高階中值濾波組合、加權中值濾波以及迭代中值濾波等。

中值濾波的線性組合是將幾種視窗尺寸大小和形狀不同的中值濾波器復合使用,只要各視窗都與中心對稱,濾波輸出可保持幾個方向上的邊緣跳變,而且跳變幅度可調節。

高階中值濾波組合可以使輸入影象中任意方向的細線條保持不變。

為了在一定的條件下盡可能去除雜訊,又有效保持影象細節,可以對中值濾波器引數進行修正, 如加權中值濾波, 也就是對輸入視窗進行加權。

也可以是對中值濾波器的使用方法進行變化, 保證濾波的效果, 還可以和其他濾波器聯合使用。

2).均值濾波(模糊演算法)

均值濾波是典型的線性濾波演算法,它是指在影象上對待處理的畫素給乙個模板,該模板包括了其周圍的臨近畫素。將模板中的全體畫素的均值來代替原來的畫素值的方法。

3)維納(wiener)濾波

維納(wiener)濾波是對退化影象進行恢復處理的另一種常用演算法,是一種有約束的恢復處理方法,其採用的維納濾波器是一種最小均方誤差濾波器,其數學形式比較複雜:

f(u,v)=[(1/h(u,v))*(|h(u,v)|2)/(|h(u,v)|2+s*[sn(u,v)/sf(u,v)])]*g(u,v)

& nbsp;   當s為1時,上式就是普通的維納濾波;如果s為變數,則為引數維納濾波,如果沒有雜訊干擾,即sn (u,v)=0時,上式實際就是前面的逆濾波。從其數學形式可以看出:維納濾波比逆濾波在對雜訊的處理方面要強一些。以上只是理論上的數學形式,在進行實際處理時,往往不知道雜訊函式sn(u,v)和sf(u,v)的分布情況,因此在實際應用時多用下式進行近似處理:

f(u,v)=[(1/h(u,v))* (|h(u,v)|2)/(|h(u,v)|2+k)]*g(u,v)

其中k是乙個預先設定的常數。

C 識別驗證碼

今天跟大家一起分享切分和識別,在這裡就要有個分支,切分有兩個情況,乙個是分開的字元的切分和識別,另乙個是連在一起的字元的切分和識別。今天先共享分開字元的識別,仍然是原始碼共享。首先要說一下原理,在網上的很多 在切分的時候,很的情況會導致切分失敗,比如字元的左右位置不固定。所以在切分的時候,我採用的方...

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

驗證碼識別

驗證碼識別過程好比人大腦的乙個識別過程 首先,我們的眼睛接收,並將這張的資訊輸送給大腦 然後,我們的大腦接收到這個資訊以後,對這個資訊作出處理 最後,將中的有效資訊提取出來再將其和大腦中儲存的資訊進行對應對比,確定對比結果。模擬驗證碼識別,大腦接受的處理過程就相當於電腦對的預處理,大腦對進行對比和確...