Crossday Discuz! Board(簡(jiǎn)稱 Discuz!)是北京康盛新創(chuàng)科技有限責(zé)任公司推出的一套通用的社區(qū)論壇軟件系統(tǒng)
官方網(wǎng)站:
中國(guó)內(nèi)有相當(dāng)數(shù)量的論壇是采用的 Discuz 的程序,一般在注冊(cè),發(fā)帖的時(shí)候都會(huì)有圖片的驗(yàn)證碼,如果我們要通過(guò)編寫程序來(lái)批量注冊(cè)論壇賬號(hào)、批量發(fā)帖那就必須得用到這個(gè)驗(yàn)證碼的識(shí)別功能。
這編文章只是告訴大家一個(gè)原理,至于如何用代碼去實(shí)現(xiàn)就需要大家自已去動(dòng)手了。
Gif動(dòng)畫驗(yàn)證碼破解
1、分析Gif動(dòng)畫,得到總幀數(shù),和每幀的相關(guān)信息
2、取出延遲時(shí)間最長(zhǎng)的那一幀
test_pro0" alt="" src="/up/2012-9/2012090511294879164.png" width="160" height="60"/>
3、用第一行的每個(gè)像素顏色來(lái)去除背景(要限制去除范圍,不然可能去掉文字)
4、使用Closing降噪、閥值處理得到比較整潔的黑白驗(yàn)證碼
5、利用字符間空白分割字符
6、提取樣例特征進(jìn)行機(jī)器學(xué)習(xí)
7、樣例200個(gè)的情況下,識(shí)別率可以達(dá)到>80%,如果繼續(xù)學(xué)習(xí),識(shí)別率可以更高。
復(fù)雜背景的驗(yàn)證碼破解
首先我們要去除它的背景,對(duì)于這樣稍微復(fù)雜的背景,用過(guò)去的方法很難做到,上圖的例子還不是很明顯,我發(fā)現(xiàn)很多圖片背景色和字母色近似,而且字母顏色是不斷變化的,背景也是不斷變化的
那我初始的想法是找到圖片中使用顏色最多的方法,于是我們用HSL表示各點(diǎn)顏色,接著進(jìn)行統(tǒng)計(jì),得到最大的幾個(gè)峰值,這里便是圖片中幾個(gè)最豐富的顏色的L值得累加值
其余的都可以認(rèn)為是噪音,我們對(duì)每個(gè)峰值進(jìn)行分割,得到如下圖片
你看這樣就把單個(gè)顏色圖片分割出來(lái)了,接下來(lái)就是找到圖片中除去黑色和白色后的圖片
然后進(jìn)行灰化處理,閥值處理,降噪,得到
接著根據(jù)邊界檢測(cè)出來(lái)的最左側(cè)x位置,來(lái)排序字母順序
接下來(lái)的事情就輕車熟路了,把圖片轉(zhuǎn)成標(biāo)準(zhǔn)模板,通過(guò)少量學(xué)習(xí)就達(dá)到了95%以上的識(shí)別率
c:15 j:8 8:7 t:9 9:4 x:7 4:6 2:4 h:7 f:8 e:18 b:5 y:3 k:4 w:3 g:5 3:5 7:6 r:2 m:3 q:4 v:2 p:3 6:2
以上數(shù)據(jù)表示 c學(xué)習(xí)15次 j學(xué)習(xí)8次…
只要字符不粘連,大部分驗(yàn)證碼干擾技術(shù)都是可以有辦法,所以為什么google驗(yàn)證碼看起來(lái)很簡(jiǎn)單,但是沒有人能夠很好的破解它得原因。
補(bǔ)充,
rise在留言中發(fā)現(xiàn)有一些字符加入雜點(diǎn)的問(wèn)題,由于這種驗(yàn)證碼不是很普遍,稍微做了研究
CY3E 這個(gè)圖片3字中有雜點(diǎn),其他沒有,按照文章中介紹的辦法,怎么知道這個(gè)3不是像其他顏色雜點(diǎn)一樣的圖片呢?
我覺得需要加入一個(gè)步驟,就是對(duì)每次過(guò)濾顏色生成出來(lái)的圖片,進(jìn)行填充
找到3的雜點(diǎn)原圖:
然后我們進(jìn)行算法填充
這個(gè)圖片與其他全部是雜點(diǎn)的圖片之間的差別進(jìn)行過(guò)濾,我考慮可以通過(guò)以下方法:
1、連貫點(diǎn)的寬度
2、連貫點(diǎn)的個(gè)數(shù)
這樣剩下的就只剩下CY3E的過(guò)濾后的圖片
至于字符傾斜的問(wèn)題,我覺得完全可以在機(jī)器學(xué)習(xí)過(guò)程中,我們自己旋轉(zhuǎn)正在學(xué)習(xí)的圖片一定角度,例如從-10到+10度,只不過(guò)這樣的學(xué)習(xí)庫(kù)會(huì)大一些,但是就10個(gè)數(shù)字的驗(yàn)證碼來(lái)說(shuō),這點(diǎn)性能損失應(yīng)該可以忽略不計(jì)。