最近正在在學習數字圖像處理,這個滑動驗證碼從本質上來說就是將兩張圖片按照缺口的位置拼在一起,我便想嘗試使用圖像處理的方法來找到這個圖片的缺口位置。
模板匹配的方法應該是適用於該問題的,這是一種原始的、基本的模式識別的方法,我們可以通過匹配來確定目標圖像位於模板的什麼位置。
這個滑塊本身就是驗證碼圖片的一部分,通過模板匹配我們能夠得到滑塊在驗證碼圖片的位置,繼而可以控制滑塊移動的位置,達到破解滑動驗證碼的效果。
這樣我們一共需要兩張圖片,滑塊的圖片來作爲目標圖片,和有缺口的驗證碼圖片來當作模板圖片(如果有完整的無缺口圖片,同樣可以作爲模板)。
預處理
首先我們將兩圖像都轉爲更爲簡單的灰度圖像,而缺口圖的缺口部分原本就存在像素的變化,爲了使模板圖片能夠成功匹配,我們需要將滑塊圖片做一個反轉變換,得到如下圖片。
def pre_match(img_path,template_path,new_img_path,new_template_path):
# 滑塊圖
img=cv2.imread(img_path)
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=255-img
cv2.imwrite(new_img_path, img)
img=cv2.imread(new_img_path)
# 缺口圖,當作模板
template=cv2.imread(template_path)
template=cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
cv2.imwrite(new_template_path,template)
template=cv2.imread(new_template_path)
return img,template
模板匹配
得到預處理完後的圖片後,我們可以使用CV2庫的matchTemplate來實現模板匹配,找到匹配度最高的座標值,而這個座標便是這個滑塊應該被滑到的位置。
def get_match_location(img,template):
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
y,x=np.unravel_index(res.argmax(),res.shape)
return x,y
我們還可以通過畫矩陣框來將我們找到的匹配位置給框出來,從下圖效果來看,匹配的位置基本吻合。
總結
這種模板匹配的方法在無法同時輕易獲得無缺口原圖和缺口圖的情況下可能是有用的。按照網頁呈現的圖片放縮比例,我們可以準確定位滑塊正確的目標位置,從而模擬拖動滑塊,達到破解滑動驗證碼的目的。
——END——
推薦閱讀