1. 程式人生 > >用於驗證碼圖片識別的類續(C#程式碼)

用於驗證碼圖片識別的類續(C#程式碼)

    1、如何設前景/背景的分界值
    UnCodebase類中有一個GetPicValidByValue( int dgGrayValue) 函式,可以得到前景的有效區域,常有人問我前景/背景的分界值dgGrayValue是如何確定的(常用的是灰度128)。這個值的獲取是有數學演算法,叫最大類間方差法,即影象的前後景的平方差為最大時的值就是我們關心的分界值,對付如 這樣較複雜的背景非常管用,下面是具體的C#程式碼。
Code
    2、如何去除干擾點/干擾線
    2.1 干擾點/干擾線的特徵分析
    現在網上的大多數的驗證碼都是加了干擾的,一般分為干擾點和干擾線,如下圖。標用1、2、3的分別為點、線、字元。

   去幹擾,一般是逐點分析,這三種情況下,每一點及周邊8個點的情況都不一樣(分別為1點,3點,8點),這是一種干擾資訊的粒度比字元的粒度小的典型情況。現在就可以動手編寫去雜程式碼了。
    
    2.2 根據周邊有效點數去噪函式 Code     2.3 濾波演算法去噪函式
     影象預處理中有多種濾波演算法,其原理與方法分別為
     1) 中值濾波
    它通過從影象中的某個取樣視窗取出奇數個數據進行排序得到的結果。顧名思義,所謂中值就是視窗中奇數個數據按大小順序排列後處於中心位置的那個數。中值濾波以視窗的中值作為處理結果。
    實現起來很簡單
    1:先對視窗排序
    2:用排序後的中值取代要處理的資料即可
    注意事項:
    1:注意影象邊緣資料的處理
    2:對於不同的目的選用不同的窗體,一般有3×3,5×5等等
Code    經過實際執行證實,中值濾波能有效去除影象中的噪聲點,特別是在一片連續變化緩和的區域中(比如人的衣服,面板),幾乎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是一個預先設定的常數。