滑動驗證碼


萬聖節那天下班回家在地鐵口碰到公司一全棧高手(前端人員寫CS結構程序),當然自然而然就順便聊了一下技術,期間就說到了滑動驗證碼,首先聲明我不是做計算機圖形的,只是以前做過簡單的驗證碼識別和遠控,都是基於圖像處理的,可以說對於圖像處理我只會點皮毛,和一點基礎算法吧。當時聽同事稍微了說了下感覺有一定的難度,還聽說公司里面有一個“同事”用python寫成了開源組件,在這給大佬們點個大大的贊。可惜就只聊了那么幾分鍾吧,同事到站了,就留我一個人在地鐵上看着抖音。
晚上回到家想了下,決定試試,打開瀏覽器訪問京東官網,通過DOM元素簡單的看了下京東的滑動驗證碼。無獨有偶恰巧周六小孩學校活動爬山,孩子她媽問我去不去,我想了下,當時就果斷決定了不去,心里在想明天好好碼一天code,看能不能解決滑動驗證碼識別的問題。
第二天一大早起來,坐電腦旁邊巴拉巴拉了一堆代碼,不用說大家應該知道,就是采用一些基礎算法把彩色絢麗的原圖灰度化、二值化、降糙等等。求灰度值有專門的公式,不需要我們補腦RGB三元組,二值化也很簡單,所謂二值就是0 1,不是黑就是白,但是需要自己結合圖片設定閾值。非專業的話,還是建議做圖片處理的朋友,首先還是先了解熟悉Color ARGB BitMap位圖 像素 位深 跨距 PNG JPG等等,百度一堆。下面看看我這邊處理的效果。
基本處理
原圖:
灰度化:
二值化:
可能中間還有去糙的操作,結合實際情況吧,這些基礎的圖像處理,其實很簡單。二值化之后,圖片上紅色箭頭部分就是我要找的部分,怎么找呢?其實就算是橫豎遍歷時間復雜度也還好,因為圖片像素小啊,指針處理法還是很快的(主要這種遍歷橫豎不適合)。具體怎么找,這里我簡單說下我的見解,對於我們這些不是做圖形學的朋友來說,看到這么一張圖片如果按照程序的邏輯去思考還真比較呆板和麻煩。那怎么辦?我的處理方式,站在我的角度,我眼睛識別的角度,我眼睛看到哪個區域再傳給我大腦比較,如果不是再隨機掃這幅圖片的另外一個區域。說的很簡單,那么問題來了,代碼怎么寫?這個算法怎么寫?
查找我先說下我第一種吧
1.對這副圖片隨機撒點1000個,具體多少個結合圖片像素大小吧,然后遍歷這1000個點,如果這個點的顏色值&255=255,我就向左邊掃描,直到不能掃為止,也就是色塊不同,然后沿周邊掃描,最后發現邏輯不好控制,如果被掃圖片部分非常不規整和復雜的話,覆蓋率不是很可觀,果斷放棄,考慮另外一種方法。
2.對這副圖片隨機撒點1000個,然后遍歷這1000個點,如果這個點的顏色值&255=255,那么一這個點為中心形成類似九宮格的排列,向4周8個像素點擴散,直到每個像素點不能擴散為止,也就是色塊值不同了,這種做法代碼簡單邏輯清楚,覆蓋率100%,也就是說二值之后的圖片能把所有要找的部分找出來。細心的朋友可能覺得隨機撒點不靠譜?確實不靠譜,於是我在撒點算法上改進了一下。
3.我要找的圖片部分寬高各50,實際上我只要一個像素點命中我要找的圖片部分,通過擴散查找算法,它就能幫我找出來,所以在隨機撒點算法里面我改成跳躍式的撒點,只要被找部分在里面就逃不掉。這樣撒點和查找結合就能大大提高查找的效率。接下來看圖:
可能有些朋友會說,怎么前面有些沒查出來?那是因為我跳躍撒點的間距比較大而已。
識別 找是找到了,怎么識別呢?有了前面查找提供的基礎數據,識別就變的簡單了。上圖每查找出一個圖片軌跡,我就會把它的軌跡像素點存儲在一個多維列表里面,通過多張驗證碼圖片比對發現填充的位置部分和填充的圖片對象像素點大小不超過50,這樣就很容易找到填充位置坐標在哪里。退一步說即便我不用這種方法,我可以根據幾何圖像相似度也可以處理這個問題,我可以根據邊,高,寬,長等特性按比例計算相似度。最后拿到了填充位置計算一下填充圖片和填充位置的坐標距離,然后觸發js拉動填充圖片即可,當然最后一部我就沒做了,理論上這么可以做吧。
好了就說這么多吧,本人不是做圖像識別的,說的不對或者哪里有錯誤,希望看官指出,最后謝謝吧。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM