[轉貼] http://www.cnblogs.com/kingthy/archive/2008/08/06/1262475.html
163相冊驗證碼圖片的識別手記之一 --- 去除干擾
聲明: 此文章只是記錄我在處理163相冊驗證碼圖片識別過程時的想法思路,在此發表只是純粹基於技術探討目的.因此在文章中不會提供任何源碼下載!!任何人利用這裡介紹的方法所做任何事情而出現的責任本人概不負責!!如果需要轉載此文,請註明原作者和出處!!
一.認識驗證碼圖片
下面提供幾種163相冊的驗證碼圖片樣例:





從上面的樣例圖中可知道163相冊的驗證碼只是使用了平常所見的中規中距的0-9數字驗證碼和外加一些干擾措施,其中0-9數字圖如下:










二.去除干擾
從上面的樣例圖中可知道163相冊的驗證碼圖片使用了"變色","干擾點","干擾線","變位"等幾種用於干擾自動識別的"手段".因此為了方便程序識別則必須先將干擾去掉.
"變色" : 在某些簡單的驗證碼圖片中常常將背景色或干擾色和前景色(驗證碼顏色)的顏色值分別固定用不同範圍內的顏色表進行填充.而對於使用此種"變色手段"的圖片則可以使用"二值分化"將驗證圖片處理為只有兩種顏色的圖片後再進行處理即可.而163的驗證碼圖片中的干擾點和干擾線的顏色和數字的顏色都基本都是隨機的.所以"二值分化"方案在這裡就用不上了.(註:但也幸好有了"變色",導致各個干擾點/線和各個驗證碼的顏色是基本不相同的,所以對幹擾去除提供了更大的方便).
"干擾點" : 處理那些單獨的干擾點就實在太容易了.只要掃瞄一遍圖片,判斷哪些顏色點的四周是空的(顏色值為背景色)就基本可以判斷那點為干擾點了.然後將去除(置為背景色)即可.
去除干擾點後的驗證碼圖片樣例如下:





"干擾線" : 從上面兩組對比可看出.去除干擾點後,效果也不是很明顯:( 干擾線佔的比率太大了.所以還要進一步去掉干擾線.而對於直線型的干擾線.則可以簡單直接判斷某點的顏色值是否連續出現,如果連續出現次數超過10次(嘿嘿,留個作業.這個值怎麼來的?)則基本可以判斷為干擾線.但可惜的是.163驗證碼圖片中使用的是非直線型干擾線.所以此方法行不通.只好採用"塊判斷法"(嘿嘿,自己取的名字).也就是掃瞄一遍圖片.當掃瞄到某點時,則以此點為左上角,取寬為8高為10的塊(又是一個作業.這兩個值怎麼來的?如果上面的作業會做了.這個應該不是問題了.嘿嘿).然後判斷此點的顏色值在此塊中出現的次數.如果出現的次數越過一定數量(這個數量值很重要,因為關係到干擾線清除的"乾淨度"又關係到是否會"誤殺"掉驗證碼圖片.我試驗過程中使用的是17)則可認為此顏色值是驗證碼使用的顏色.否則繼續掃瞄下一點.直到圖像的所有點掃瞄完成.掃瞄完後則可認為除了剛掃瞄到的驗證碼顏色外其它顏色都可認為為干擾色直接去除即可.
根據上面方法進行處理後的驗證碼圖片樣例如下:





效果出來了.部份圖片明顯的將干擾線去掉了.但是對某些特殊(彎曲特歷害的)的干擾線還是去除不了.分析到這裡後我的思路卡殼了.要怎麼樣才能將那些彎曲的干擾線去除掉呢?來來回回的看了驗證碼樣例圖片和0-9數字圖片,終於有一個"啊哈"閃光在我頭腦裡呈現:為什麼我要取塊來判斷呢(把問題搞複雜化了-_-),直接使用顏色"步長"(又是我自己取的名字>p<)統計不就可以了嗎?
顏色步長統計法:
在驗證碼圖片裡干擾線和驗證碼的顏色是分別不相同的(拜"變色"所托!)並且0-9數字圖片的長寬是固定的(作業答案在這裡.嘿嘿).所以直接在掃瞄圖片時記錄每種顏色的出現次數和第一次與最後出現的坐標.掃瞄完圖像後統計"出現次數大於一定數量(這個數量值很重要,我試驗時取的是20)並且最後出現和第一次出現的x軸差必須為正負8之內,y軸差必須為正負10"的顏色(驗證碼顏色).如果不滿足此統計條件的顏色都可認為為干擾色直接去除即可.
根據上面方法進行處理後的驗證碼圖片樣例如下:





到此,所有干擾線都完美的去除了.剩下的就是怎麼識別驗證碼了.