网页验证码识别实例VB.NET2019(二)
??上一節(jié),獲取了網(wǎng)頁驗(yàn)證碼。這一節(jié)開始講講怎么識別驗(yàn)證碼。
??2、獲取36個字符的特征碼
??2.1 分析驗(yàn)證碼特征
驗(yàn)證碼圖片:
??經(jīng)研究,發(fā)現(xiàn)該網(wǎng)頁驗(yàn)證碼的圖片中字符是由數(shù)字和大寫字母組成,每張驗(yàn)證碼4個字符。其中由于數(shù)字0、1和和字母O和I比較接近,所以這四個字符沒有出現(xiàn),再加上和2比較像的字母Z一共有5個字符沒有,所以出現(xiàn)的字符只有35個。
??驗(yàn)證碼字符沒有變形,大小一致。背景有噪點(diǎn),大小不一。
??2.3驗(yàn)證碼字符特征碼必須的流程:
圖片灰度化圖片二值化圖片分割圖片特征碼提取圖片特征碼提取參考louislong007兄弟的博文做了修改(https://blog.csdn.net/louislong007/article/details/47683035)
??2.4 圖片灰度化
??圖片灰度化就是利用特定算法,將彩色圖片中的每一個像素點(diǎn)R、G、B三個顏色分量轉(zhuǎn)換為相同的色值(0-255)。
?? 根據(jù)YUV的顏色空間中,Y的分量的物理意義是點(diǎn)的亮度,由該值反映亮度等級,根據(jù)RGB和YUV顏色空間的變化關(guān)系可建立亮度Y與R、G、B三個顏色分量的對應(yīng):Y=0.3R+0.59G+0.11B,以這個亮度值表達(dá)圖像的灰度值。
??2.5 圖片二值化
??所謂二值化,就是將灰度化的圖片轉(zhuǎn)變?yōu)橹挥袃煞N顏色的圖片,即黑色(0,0,0)和白色(255,255,255)。取圖片的平均灰度值,遍歷圖片中每一個像素點(diǎn),大于該值設(shè)為白色,小于該值設(shè)為黑色。
??二值化代碼:
??2.6 圖片去噪
先看看去噪效果圖片:
??2.6.1 噪點(diǎn)的判定
??這里由于我處理的網(wǎng)頁驗(yàn)證碼比較簡單,只涉及到噪點(diǎn)的去除,沒有涉及到干擾線的去除。所以下面所講的只涉及到噪點(diǎn)的去除,對干擾線的去除方法網(wǎng)上有很多,有需要的可以自己去百度。
??我們怎么去判定噪點(diǎn)和字符呢?也就是噪點(diǎn)和字符的區(qū)別。
??從前面經(jīng)過二值化處理可知,如果一個pixel是驗(yàn)證碼或者干擾因素的一部分,那么這個pixel在二值化結(jié)果中其灰度值一定是0,即黑色;如果一個pixel是背景,則其灰度值應(yīng)該是255是白色。因此對于孤立的噪點(diǎn),其周圍應(yīng)該都是白色,或者大多數(shù)點(diǎn)都是白色pixel。
??2.6.2 去除噪點(diǎn)的方法及原理
??噪點(diǎn)去除的方法比較多,這里介紹比較簡單的兩種方法:8鄰域去噪和連通域去噪。
??2.6.2.1 8鄰域去噪
??原理:對一個噪點(diǎn)來講,其周圍的pixel應(yīng)該全是白色的背景才對,準(zhǔn)確來講就是一個噪點(diǎn)pixel是黑色的并且外包的8個相鄰pixel全是白色。當(dāng)然,如果圖片分辨率夠高,一個噪點(diǎn)實(shí)際上可能是有很多個pixel組成,所以此時的判斷條件應(yīng)該放寬,即一個pixel是黑色的并且相鄰的8個pixel白色的大于一個固定值,那么這個pixel就是噪點(diǎn)。對于不同的驗(yàn)證碼,這個閥值是不固定的,所以在這可以設(shè)置大小,多試幾次,找到最佳的閥值。
??我們看看效果:
??去噪強(qiáng)度是指噪點(diǎn)判斷標(biāo)準(zhǔn),例如,去噪強(qiáng)度為3,表示如果黑點(diǎn)周圍8鄰域中黑點(diǎn)的個數(shù)為3個或者3個以下,則判定此黑點(diǎn)為噪點(diǎn),將其顏色設(shè)為白色(即背景色)。
??隨著去噪強(qiáng)度的增加,噪點(diǎn)去除了,但是字符也被部分去除了,經(jīng)對比,去噪強(qiáng)度為4效果較好。即便這樣,字符部分仍有部分損失。
以下為8鄰域去噪代碼:
??2.6.2.2 連通域去噪
??原理:字符是由很多個黑色像素點(diǎn)組成的一大片連通域,而噪點(diǎn)是黑色像素點(diǎn)組成的一小片連通域。連通域去噪就是將小面積(即黑色像素點(diǎn)的個數(shù))的連通域去掉(背景色化),保留面積較大的連通域(字符區(qū)域)。
看看效果:
??通過以上,字符面積在50到100之間。也就是說,連通域面積小于50的都可以認(rèn)定為噪點(diǎn),可以去除。其實(shí),這個例子中,噪點(diǎn)面積最大也沒有超過10。
??從效果對比來看,連通域去噪字符部分沒有損失,而8鄰域去噪,字符部分會有損失,可能會影響驗(yàn)證碼的識別。所以這里我選擇了連通域去噪方法去噪。
連通域去噪代碼:
自定義泛水填充函數(shù)代碼,詳細(xì)內(nèi)容可參考我的博客《 vb.net 自定義的FloodFill函數(shù)(泛水填充)》
Public Function mxdFloodFill(ByVal bm As Bitmap, ByVal SeedPoint As Point, ByVal Cr As Color) As Boolean 'seed-fill,4-neighbours,以種子點(diǎn)顏色相同的連通區(qū)域進(jìn)行填充。' a、將B(x,y)作為種子(像素位置),并賦予其一個label,然后將該種子相鄰的所有前景像素都壓入棧中;' b、彈出棧頂像素,賦予其相同的label,然后再將與該棧頂像素相鄰的所有前景像素都壓入棧中;' c、重復(fù)b步驟,直到棧為空;' 此時, 便找到了圖像B中的一個連通區(qū)域, 該區(qū)域內(nèi)的像素值被標(biāo)記為label;Dim newColor As Color = CrDim seedColor As Color = bm.GetPixel(SeedPoint.X, SeedPoint.Y)Dim StackSeed As New StackDim FourNeighbours As List(Of Point)If SeedPoint.X > bm.Width - 1 Or SeedPoint.Y > bm.Height - 1 ThenReturn FalseExit FunctionEnd IfStackSeed.Push(SeedPoint)Do While StackSeed.Count <> 0Dim PopSeed As Point = StackSeed.PopFourNeighbours = GetFourNeighbourSeeds(bm, PopSeed) '上下左右四鄰點(diǎn)For Each point In FourNeighboursIf Not StackSeed.Contains(point) ThenStackSeed.Push(point)End IfNextbm.SetPixel(PopSeed.X, PopSeed.Y, newColor)LoopReturn TrueEnd Function未完待續(xù)!
總結(jié)
以上是生活随笔為你收集整理的网页验证码识别实例VB.NET2019(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 低压差线性稳压器(LDO)设计与仿真
- 下一篇: asp.net ajax控件工具集 Au