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