以DZ論壇驗證碼識別為例:
對于比較復雜的驗證碼,比如DZ論壇最新的驗證碼,處理起來相對麻煩一些,但是原理還是和普通的識別一樣的,無非多了個背景處理的方案,看如下對DZ論壇的驗證碼的識別的思路。

首先我們要去除它的背景,對于這樣稍微復雜的背景,用過去的方法很難做到,上圖的例子還不是很明顯,我發現很多圖片背景色和字母色近似,而且字母顏色是不斷變化的,背景也是不斷變化的。





那我初始的想法是找到圖片中使用顏色最多的方法,于是我們用HSL表示各點顏色,接著進行統計,得到最大的幾個峰值,這里便是圖片中幾個最豐富的顏色的L值得累加值。

其余的都可以認為是噪音,我們對每個峰值進行分割,得到如下圖片

你看這樣就把單個顏色圖片分割出來了,接下來就是找到圖片中除去黑色和白色后的圖片:

然后進行灰化處理,閥值處理,降噪,得到:

接著根據邊界檢測出來的最左側x位置,來排序字母順序:

接下來的事情就輕車熟路了,把圖片轉成標準模板,通過少量學習就達到了95%以上的識別率:
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
以上數據表示 c學習15次 j學習8次…

只要字符不粘連,大部分驗證碼干擾技術都是可以有辦法,所以為什么google驗證碼看起來很簡單,但是沒有人能夠很好的破解它得原因。
補充,
有一些字符加入雜點的問題,由于這種驗證碼不是很普遍,稍微做了研究

CY3E 這個圖片3字中有雜點,其他沒有,按照文章中介紹的辦法,怎么知道這個3不是像其他顏色雜點一樣的圖片呢?

我覺得需要加入一個步驟,就是對每次過濾顏色生成出來的圖片,進行填充
找到3的雜點原圖:

然后我們進行[算法](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=ca709a7c2cee8241&k=%CB%E3%B7%A8&k0=%CB%E3%B7%A8&kdi0=0&luki=1&n=10&p=baidu&q=67051059_cpr&rb=0&rs=1&seller_id=1&sid=4182ee2c7c9a70ca&ssp2=1&stid=0&t=tpclicked3_hc&td=1740074&tu=u1740074&u=http%3A%2F%2Fwww%2Eeducity%2Ecn%2Flabs%2F649007%2Ehtml&urlid=0)填充:

這個圖片與其他全部是雜點的圖片之間的差別進行過濾,我考慮可以通過以下方法:
1、連貫點的寬度
2、連貫點的個數
這樣剩下的就只剩下CY3E的過濾后的圖片了。
至于字符傾斜的問題,我覺得完全可以在[機器學習](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=ca709a7c2cee8241&k=%BB%FA%C6%F7%D1%A7%CF%B0&k0=%BB%FA%C6%F7%D1%A7%CF%B0&kdi0=0&luki=2&n=10&p=baidu&q=67051059_cpr&rb=0&rs=1&seller_id=1&sid=4182ee2c7c9a70ca&ssp2=1&stid=0&t=tpclicked3_hc&td=1740074&tu=u1740074&u=http%3A%2F%2Fwww%2Eeducity%2Ecn%2Flabs%2F649007%2Ehtml&urlid=0)過程中,我們自己旋轉正在學習的圖片一定角度,例如從-10到+10度,只不過這樣的學習庫會大一些,但是就10個數字的驗證碼來說,這點性能損失應該可以忽略不計。