驗(yàn)證碼識(shí)別基礎(chǔ)方法及源碼_第1頁(yè)
驗(yàn)證碼識(shí)別基礎(chǔ)方法及源碼_第2頁(yè)
驗(yàn)證碼識(shí)別基礎(chǔ)方法及源碼_第3頁(yè)
驗(yàn)證碼識(shí)別基礎(chǔ)方法及源碼_第4頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、先說(shuō)說(shuō)寫這個(gè)的背景最近有朋友在搞一個(gè)東西,已經(jīng)做的挺不錯(cuò)了,最后想再完美一點(diǎn),于是乎就提議把這種驗(yàn)證碼給 K.O. 了,于是乎就 K.O. 了這個(gè)驗(yàn)證碼。達(dá)到單個(gè)圖片識(shí)別時(shí)間小于 200ms ,500 個(gè)樣本人工統(tǒng)計(jì)正確率為 95% 。由于本人沒(méi)有相關(guān)經(jīng)驗(yàn), 是摸著石頭過(guò)河。 本著經(jīng)驗(yàn)分享的精神,分享一下整個(gè)分析的思路。在各位大神面前獻(xiàn)丑了。再看看部分識(shí)別結(jié)果是不是看著很眼熟?處理第一步,去背景噪音和二值化對(duì)于這一塊,考慮了幾種方法。方法一,統(tǒng)計(jì)圖片顏色分布,顏色占有率低的判定為背景噪音。由于背景噪音和前景色區(qū)分并不明顯,嘗試了很多種取景方法都不能很好去除背景噪音,最終放棄了這種方法。方法二,

2、事后在網(wǎng)上稍微查了下,最近比較流行計(jì)算灰度后設(shè)定一個(gè)閾值進(jìn)行二值化。其實(shí)所謂的灰度圖片原理是根據(jù)人眼對(duì)色彩敏感度取了權(quán)值,這個(gè)權(quán)值對(duì)計(jì)算機(jī)來(lái)說(shuō)沒(méi)有什么意義。稍微想一下就可以發(fā)現(xiàn), 這兩個(gè)過(guò)程完全可以合并。 于是乎我一步完成了去背景噪音和二值化。閾值設(shè)置為 RGB 三分量之和到 500 。結(jié)果非常令人滿意。處理第二步,制作字符樣本樣本對(duì)于計(jì)算機(jī)來(lái)說(shuō)是非常重要的,因?yàn)橛?jì)算機(jī)很難有邏輯思維,就算有邏輯思維也要經(jīng)過(guò)長(zhǎng)期訓(xùn)練才能讓你滿意。所以要用事先制作好的樣本進(jìn)行比較。如果你仔細(xì)觀察過(guò)這些驗(yàn)證碼會(huì)發(fā)現(xiàn)一個(gè) bug ,幾乎大部分的驗(yàn)證碼都是使用同樣的字體,于是乎就人工制作了一套字體的樣本。由于上一步已經(jīng)

3、有去除背景噪音的結(jié)果,可以直接利用。制作樣本這一步有點(diǎn)簡(jiǎn)單枯燥,還需要細(xì)心??赡芤?yàn)槟愕囊粋€(gè)不細(xì)心會(huì)導(dǎo)致某個(gè)符號(hào)的識(shí)別率偏低。在這 500 個(gè)樣本中,只發(fā)現(xiàn)了 31 個(gè)字符。幸虧是某部門的某人員還考慮到了易錯(cuò)的字符,例如, 1 和 I , 0 和 O 等。要不然這個(gè)某部門要背負(fù)更多的罵名。處理第三步,匹配單個(gè)匹配用了最簡(jiǎn)單最原始的二值比較,不過(guò)匹配的是匹配率而不是匹配數(shù)。我定義了相關(guān)的計(jì)分原則。大原則是“該有的有了加分,該有的沒(méi)了減分,不該有的有了適度減分,可達(dá)區(qū)域外的不算分”。由于一些符號(hào)的部分區(qū)域匹配結(jié)果跟另一些符號(hào)的完整匹配結(jié)果相似,需要把單個(gè)匹配在一個(gè)擴(kuò)大的區(qū)域擇優(yōu)。在一定的圍, 找到

4、一個(gè)最佳匹配,這個(gè)最佳匹配就是當(dāng)前位置對(duì)應(yīng)的符號(hào)。完成了一次最佳匹配,可以把匹配位置向右推進(jìn)一大步,若找不到合適的最佳匹配就向右推進(jìn)一小步。處理第四步,優(yōu)化和調(diào)整任何一個(gè)算法都是需要優(yōu)化和調(diào)整的。現(xiàn)在要找到最佳參數(shù)配置和最佳代碼組織。這一步往往是需要花費(fèi)最多時(shí)間和精力的。處理第五步,驗(yàn)證結(jié)果這一步呢,純?nèi)肆︱?yàn)證結(jié)果,統(tǒng)計(jì)出正確率。思考結(jié)果是出來(lái)了,代碼也不多,效果也很理想。搞這一行的,很多時(shí)候都想要通用的。能否通用,很大程度上在于抽象層次。本方法只是單純的匹配, 自然不能通用,但是方法和思想?yún)s是通用的。具體案例具體分析。至于扭曲文字、空心文字等,處理要復(fù)雜的多。網(wǎng)上也有一些使用第三方圖像庫(kù)的方

5、法,也許那些方法會(huì)比較通用。等有空了有興趣了繼續(xù)搞一下這個(gè)主題。源碼至于這個(gè)源碼要不要發(fā)布,糾結(jié)了一段時(shí)間。網(wǎng)上已經(jīng)有類似的商業(yè)活動(dòng)了,而且這個(gè)識(shí)別本身沒(méi)有太大難度,再加上某系統(tǒng)天生的 bug ,此驗(yàn)證碼本身就相當(dāng)于沒(méi)有設(shè)置,因此發(fā)布此代碼,僅作于學(xué)習(xí)交流。+ View Code?123456789101112131415161718192021usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.IO;usingSystem.IO.Compression;namespaceCrack12306Captchapublic

6、 class CrackerList<CharInfo> words_ = newList<CharInfo>();public Cracker()var bytes = newbyte 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00, 0x00, 0x04, 0x00, 0xc5, 0x58, 0xd9, 0x92, 0x13, 0x31,0x0c,0x94,0x9e,0x93,0x0c,0x61,0x97, 0x2f, 0xe1, 0x58, 0xe0, 0x91, 0x9b, 0x82, 0x62, 0x0b,0x58,0xee,0xff,0

7、xff,0x10,0xd8,0xcc, 0xc8, 0xea, 0x96, 0x6c, 0x8f, 0x13, 0x48, 0xe1, 0xaa,0x4d,0x46,0x96,0x6d,0xb5,0x8e,22 0x96, 0x67, 0x73, 0x7f, 0x3b, 0x09, 0x0e, 0x25, 0x41, 0x49,230xa3, 0xae, 0xd7, 0x5b, 0xa9, 0xa8,24 0xd5, 0xb4, 0x76, 0x02, 0x6a, 0x5c, 0x52, 0x94, 0x54, 0xed,250x18, 0x5a, 0x7f,0x18, 0x00, 0x00,

8、26 0x84, 0x07, 0x1b, 0x80, 0x4a, 0x9a, 0x08, 0x35, 0xb8, 0x81,270x50, 0xe7, 0xad, 0xbe, 0xc4, 0x8e,28 0xb1, 0x4f, 0x2d, 0x5f, 0xba, 0x80, 0xbb, 0xfd, 0x9a, 0xad,290x19, 0x36, 0xe5, 0xad, 0x87, 0xf1,30 0x10, 0xc0, 0x8d, 0xc6, 0x50, 0x40, 0x52, 0xf8, 0xb3, 0x98,310x2c, 0xd6, 0xec, 0x59, 0xe7, 0x0d,32

9、0x3e, 0x0f, 0x93, 0x3e, 0x1d, 0x02, 0x7a, 0x18, 0x8f, 0xb6,330xc7, 0x46, 0x4e, 0x01, 0xa3, 0x96,34 0xdc, 0x3a, 0x20, 0x77, 0xbf, 0x2c, 0x24, 0xe4, 0x80, 0xa9,350x20, 0x14, 0xe5, 0x2d, 0xb5, 0x68,36 0xc9, 0x55, 0x89, 0x23, 0x96, 0x82, 0xaa, 0xba, 0x58, 0xa6,370x03, 0x38, 0x71, 0x4b, 0x29, 0xd2,38 0x4

10、7, 0x80, 0xe3, 0x84, 0x91, 0xf4, 0x78, 0x43, 0x64, 0x41,390x7b, 0x73, 0x99, 0x80, 0x42, 0x48,40 0x00, 0xde, 0x00, 0x12, 0x88, 0x80, 0xdb, 0x51, 0x4a, 0x49,410x84, 0x43, 0xf6,0x51, 0x90, 0x27,42 0x21, 0xc9, 0xf8, 0xac, 0x00, 0x4d, 0xcd, 0x46, 0x09, 0x9d,430x15, 0x78, 0xe0, 0x00, 0x1e, 0x44,44 0x2a, 0

11、x51, 0x8c, 0xbc, 0xd3, 0xa3, 0x68, 0x8a, 0xd5, 0x3a,450x20, 0x79, 0xba, 0x4d, 0x71, 0x4c,46 0x0b, 0x91, 0x98, 0x90, 0x7b, 0x2a, 0x42, 0xc5, 0x78, 0x7a,470xfc,0xd5, 0x1b, 0x4b, 0x09, 0xa7,48 0x27, 0x99, 0x38, 0x05, 0x01, 0xc2, 0x80, 0x39, 0x9c, 0x67,490xbb, 0x4e, 0x7f,0x6c, 0x33, 0xdd,50 0xed, 0x87,

12、0x55, 0xda, 0x5d, 0xb5, 0x56, 0x33, 0xc6, 0xf9,510xea, 0x60, 0x64, 0xcf,0xa7, 0x41,52 0xe0, 0x5c, 0x1c, 0xc4, 0xb2, 0x25, 0xa3, 0x89, 0x88, 0x8d,530x16, 0x00, 0xb5, 0xed, 0xa5, 0x22,54 0x9d, 0x52, 0x41, 0x53, 0x8d, 0x92, 0x7f, 0x31, 0x51, 0x3f,550xa8, 0x00, 0x85, 0x8a, 0x71, 0x10,56 0x92, 0x78, 0xc4

13、, 0x59, 0x08, 0x39, 0x69, 0xa9, 0x38, 0x41,570x48, 0xf7,0x40, 0x5a, 0x03, 0xd5,58 0x3a, 0xf5, 0xe5, 0x9d, 0x33, 0x66, 0xc3, 0xd7, 0x1f, 0xef,590x94, 0xa0, 0x53, 0xea, 0xf4,0x15,60 0xb2, 0x1c, 0x40, 0x2d, 0xcf, 0xaf, 0xce, 0xe9, 0xd4, 0x7a,610x89, 0x09, 0xe6, 0xdd, 0xdb, 0x0e,62 0xb8, 0x58, 0xa7, 0x6

14、0, 0x37, 0xfd, 0xf2, 0xfa, 0x2c, 0x4e,630x51, 0x87, 0x0d, 0xfc,0x16, 0x72,64 0x2a, 0x5f, 0xc0, 0x80, 0xf0, 0x54, 0xa7, 0xde, 0xfc, 0x15,650x8b, 0x9a, 0x36, 0x3a, 0x2c, 0x62,66 0xfc, 0xd4, 0x8c, 0x31, 0xb7, 0xea, 0xd7, 0x26, 0xc4, 0xaf,670x75, 0xea, 0xdb, 0x8b, 0xff,0x9b,68 0x9b, 0x50, 0x7e, 0xfe, 0x

15、15, 0xab, 0x17, 0x2f, 0x96, 0x96,690xbd, 0xaa, 0x87, 0xdd, 0x77, 0xa3,70 0x77, 0xd3, 0x85, 0xf0, 0xe0, 0x58, 0xd5, 0xf6, 0x8c, 0xcd,710xc4, 0x63, 0x52, 0x12, 0x48, 0x46,72 0x0f, 0x93, 0x5a, 0xe3, 0xea, 0x24, 0x67, 0x73, 0x63, 0xa0,730xdf,0xdf,0x3d, 0x67, 0xf6,0xa9,74 0xfc, 0xed, 0x08, 0xe3, 0x82, 0x

16、57, 0x08, 0x35, 0x47, 0x68,750x9c, 0x01, 0x40, 0x87, 0x8b, 0xbd,76 0x0c, 0xb3, 0xf4, 0xe1, 0x72, 0xd7, 0x54, 0x62, 0xfd, 0x40,770xed, 0x99, 0xa6, 0x7e, 0x2b, 0xe4,78 0xb4, 0xc4, 0x62, 0x0d, 0x79, 0xae, 0x1b, 0xd7, 0xf4, 0x09,790xb7, 0xe1, 0x7c, 0x44, 0x09, 0x9a,80 0xda, 0xff, 0x52, 0x6a, 0x3c, 0xe1,

17、 0xc8, 0xd7, 0xbd, 0xbb,810xbe, 0x37, 0xfc,0xd6, 0xd5, 0x4e,82 0x3c, 0x40, 0x2a, 0x4b, 0x39, 0x1a, 0xbd, 0x2a, 0xcd, 0xc1,830x18, 0x59, 0x40, 0x62, 0x78, 0xec,84 0x63, 0x19, 0x72, 0xf0, 0xcf, 0xf8, 0x38, 0xfa, 0x42, 0x3a,850xc8, 0x02, 0xec, 0x5b, 0xeb, 0x8d,86 0xae, 0xf1, 0x45, 0xdd, 0x32, 0x98, 0x3

18、5, 0x3c, 0x9f, 0xa6,870x3d, 0xce, 0x13, 0xce, 0x94, 0x38,88 0x87, 0x00, 0x8d, 0x85, 0xc4, 0x70, 0x17, 0x26, 0x0e, 0xa6,890x1e, 0x16, 0xcb, 0xbf,0x52, 0xdf,90 0x29, 0x63, 0xc4, 0xf6, 0x8c, 0x35, 0xba, 0xf2, 0xf9, 0x1f,910xbf,0x73, 0x1f,0x91, 0x1b, 0x9e,92 0x24, 0x5e, 0x63, 0x22, 0x82, 0x23, 0x05, 0x1

19、9, 0xb9, 0x71,930x73, 0xdc, 0xcf,0x05, 0x88, 0x94,94 0x71, 0xdb, 0xdd, 0x48, 0x10, 0xd5, 0x55, 0xb3, 0x52, 0xc3,950x1b, 0x01, 0x94, 0x13, 0x74, 0x94,96 0x3a, 0x80, 0x2f, 0x39, 0xe2, 0x75, 0x0e, 0xf2, 0xc6, 0x18,970xdc, 0x46, 0xfc,0xf3,0xea, 0x14,98 0x80, 0xc1, 0xce, 0x24, 0xee, 0x72, 0xed, 0x94, 0xa

20、f, 0xfb,990xa9, 0xaa, 0x4a, 0xe0, 0xd4, 0x22,100 0xc6, 0xf0, 0x57, 0x1d, 0x8e, 0xd2, 0x90, 0xc6, 0x0c, 0xd3,1010x9a, 0x53, 0xfb,0xd6, 0xb7, 0xdd,102 0x14, 0xd4, 0xbd, 0x41, 0xa7, 0x80, 0x7b, 0x23, 0xfe, 0x34,1030x56, 0x0d, 0x96, 0x46, 0x02, 0xfe,104 0xfd, 0xb2, 0x00, 0x5f, 0x01, 0x9c, 0xa0, 0x32, 0x

21、39, 0xd7,1050x90, 0xc2, 0x6c, 0xc7, 0x4e, 0x68,106 0x88, 0x7d, 0x9f, 0x9b, 0xcf, 0xa7, 0xbe, 0xa0, 0xfc, 0x18,1070x7d, 0x07, 0x5b, 0xa9, 0xbe, 0x56,108 0x1f, 0x67, 0x1a, 0x4a, 0x91, 0x9c, 0x04, 0x38, 0x53, 0x6b,1090x70, 0x68, 0x8f,0xea, 0xf4,0x34,110 0x87, 0x7f, 0x6e, 0x82, 0xc3, 0xc1, 0xab, 0x40, 0

22、xc4, 0x50,1110x13, 0x0e, 0x33, 0x5d, 0x67, 0x7d,112 0x01, 0x1f, 0xdb, 0xc0, 0x7f, 0xed, 0x87, 0x7f, 0xbc, 0x0f,1130x75, 0xe0, 0xa5, 0xba, 0xc0, 0x84,114 0x3d, 0x24, 0x04, 0xe0, 0xf1, 0x16, 0x41, 0x3b, 0x74, 0xd2,1150x52, 0xc5, 0xf8,0x7c, 0x12, 0xfb,116 0xe4, 0x37, 0x5b, 0xfb, 0x57, 0x11, 0xa1, 0x18,

23、 0x00, 0x00,117;118using (varstream = newMemoryStream(bytes)119using (vargzip = new GZipStream(stream,120 CompressionMode.Decompress)121using (var reader = newBinaryReader(gzip)122123while (true)124125char ch =126 reader.ReadChar();127128129if(ch = '0')break;intwidth =130 reader.ReadByte();1

24、31intheight =132 reader.ReadByte();133134bool, map = new135 boolwidth, height;136for (inti = 0; i < width;137 i+)138for(intj = 0; j <139 height; j+)140mapi, j141 = reader.ReadBoolean();142words_.Add(new143 CharInfo(ch, map);144145146147148149150151152153publicstringRead(Bitmap bmp)var result =

25、 string.Empty;var width = bmp.Width;var height = bmp.Height;var table = ToTable(bmp);154var next = SearchNext(table, -1);155156while(next < width - 7)157158var matched = Match(table, next);159if(matched.Rate > 0.6)160161result += matched.Char;162next = matched.X + 10;163164else165166next += 1;

26、167168169170returnresult;171172173private bool, ToTable(Bitmap bmp)174175var table = newboolbmp.Width,176bmp.Height;177for (int i = 0; i < bmp.Width; i+)178for(intj = 0; j < bmp.Height; j+)179180var color =181bmp.GetPixel(i, j);182tablei, j = (color.R +183 color.G + color.B < 500);184185186

27、187188189190191192193194195196197returntable;privateintSearchNext(bool, table, intstart)var width = table.GetLength(0);var height = table.GetLength(1);for (start+; start < width; start+)for (intj = 0; j < height; j+)if(tablestart, j)returnstart;returnstart;198199200private doubleFixedMatch(boo

28、l, source, bool,201target, intx0, int y0)202203doubletotal = 0;204double count = 0;205inttargetWidth = target.GetLength(0);206inttargetHeight = target.GetLength(1);207intsourceWidth = source.GetLength(0);208intsourceHeight = source.GetLength(1);209intx, y;210211for(inti = 0; i < targetWidth; i+)2

29、12213x = i + x0;214if(x < 0 | x >= sourceWidth)215continue;216for(int j = 0; j < targetHeight;217 j+)218219y = j + y0;220if(y < 0 | y >=221sourceHeight)222continue;223224if(targeti, j)225226total+;227if (sourcex, y)228count+;229else230count-;231else if (sourcex, y)count -= 0.55;return count / total;private MatchedChar ScopeMatch(bool, source,bool, target, intstart)inttargetWidth = target.GetLe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論