如何對圖像進(jìn)行去噪來繞過驗(yàn)證碼的方法
?通過使用廣度優(yōu)先搜索算法對圖像進(jìn)行去噪來繞過驗(yàn)證碼的新方法
驗(yàn)證碼被廣泛用作確保對系統(tǒng)執(zhí)行的操作是由人類而不是機(jī)器人完成的一種方式。然而,這種方法并不是萬無一失的,尤其是在OCR和計(jì)算機(jī)視覺技術(shù)如此發(fā)達(dá)的今天。讓我們從用戶的角度來看,每次想要訪問某個網(wǎng)站時(shí)都必須解決驗(yàn)證碼是一件非常痛苦的事情,尤其是當(dāng)你每天都需要這樣做時(shí)!在本文中,將探索我自己的繞過特定類型驗(yàn)證碼的方法。該方法利用廣度優(yōu)先搜索 (BFS) 和OpenCV在將圖像傳遞給OCR引擎 (Tesseract) 之前對圖像進(jìn)行去噪。由于有太多不同類型的文本驗(yàn)證碼具有不同形式的失真/增強(qiáng),因此我的方法僅適用于我試圖繞過的特定驗(yàn)證碼源。但也許你會在我的文章中找到一些對你自己解決驗(yàn)證碼問題有用的細(xì)節(jié)!驗(yàn)證碼
正如我所提到的,有許多不同類型的文本驗(yàn)證碼。我試圖繞過的驗(yàn)證碼的變化對單詞應(yīng)用傾斜失真,同時(shí)用雪狀圖案覆蓋圖像。從根本上(并且幸運(yùn)的是),這種類型的驗(yàn)證碼并不太難解決。這是因?yàn)轵?yàn)證碼文本本身沒有任何噪音,可以被 OCR 引擎識別。如果文本被進(jìn)一步扭曲,像 Tesseract 這樣的開源 OCR 庫將無法讀取文本。因此,我們現(xiàn)在需要做的是一系列圖像過濾以去除所有噪聲并僅保留驗(yàn)證碼文本。方法我將要討論的方法具有概率特性,這意味著它不能保證在每次試驗(yàn)中都有效。但是,我們可以利用驗(yàn)證碼和系統(tǒng)的一些先驗(yàn)知識來確保我們最大化驗(yàn)證碼的成功概率。但首先,讓我們談?wù)勻?yàn)證碼圖像的去噪方法。該過程可以概括為以下步驟:轉(zhuǎn)換為灰度中值濾波器(內(nèi)核大小 3)圖像閾值處理島嶼去除中值濾波器(內(nèi)核大小 3)
圖像首先轉(zhuǎn)換為灰度,以將通道數(shù)減少到僅 1。然后注意到在現(xiàn)有的隨機(jī)雪花噪聲之上放置了一致的明暗像素點(diǎn)圖案。中值濾波器可以有效去除這種密集和重復(fù)的噪聲模式。盡管有輕微的模糊,但經(jīng)過中值濾波器后的圖像更加清晰。我們要做的下一步是對圖像進(jìn)行閾值處理,將所有像素強(qiáng)度推到 1 或 0。閾值通過反復(fù)試驗(yàn)進(jìn)行微調(diào),以確保保留文本的所有像素。
在此之后,我們留下了驗(yàn)證碼文本,周圍是點(diǎn)狀噪聲,這是閾值化的殘留物。這些點(diǎn)分散在圖像周圍,但更多地集中在文本周圍。這就是使用 BFS 的地方,因?yàn)槲覀儗⑹褂眠@種我稱之為“島嶼去除”的方法來去除所有的點(diǎn)狀噪聲。該方法訪問了圖像上的所有黑色像素。在每個黑色像素上,它使用 BFS 找到所有也是黑色的鄰居。
本質(zhì)上,該函數(shù)識別圖像上的所有黑色像素簇,如果簇大小小于預(yù)定閾值,則將其移除(即轉(zhuǎn)換為白色像素)。這種“去除島嶼”方法的靈感來自于相當(dāng)流行的編程問題Number of Islands,你應(yīng)該使用 BFS 或 DFS 來計(jì)算二維數(shù)組(即島嶼)中 1 的簇?cái)?shù)。最后一步是應(yīng)用另一個內(nèi)核大小為 3 的中值濾波器來平滑圖像的邊緣。然后,它準(zhǔn)備好傳遞到 Tesseract OCR 進(jìn)行文本提取。從上面的步驟圖可以看出,去噪過程產(chǎn)生了相當(dāng)積極的輸出。最重要的是,Tesseract 能夠識別輸出正確驗(yàn)證碼文本的單詞就足夠了。下面是去噪的代碼片段。
def bfs(visited, queue, array, node):
# I make BFS itterative instead of recursive
def getNeighboor(array, node):
neighboors = []
if node[0]+1
neighboors.a(chǎn)ppend((node[0]+1,node[1]))
if node[0]-1>0:
if array[node[0]-1,node[1]] == 0:
neighboors.a(chǎn)ppend((node[0]-1,node[1]))
if node[1]+1
neighboors.a(chǎn)ppend((node[0],node[1]+1))
if node[1]-1>0:
if array[node[0],node[1]-1] == 0:
neighboors.a(chǎn)ppend((node[0],node[1]-1))
return neighboors
queue.a(chǎn)ppend(node)
visited.a(chǎn)dd(node)
while queue:
current_node = queue.pop(0)
for neighboor in getNeighboor(array, current_node):
if neighboor not in visited:
# print(neighboor)
visited.a(chǎn)dd(neighboor)
queue.a(chǎn)ppend(neighboor)
def removeIsland(img_arr, threshold):
# !important: the black pixel is 0 and white pixel is 1
while 0 in img_arr:
x,y = np.where(img_arr == 0)
point = (x[0],y[0])
visited = set()
queue = []
bfs(visited, queue, img_arr, point)
if len(visited) <= threshold:
for i in visited:
img_arr[i[0],i[1]] = 1
else:
# if the cluster is larger than threshold (i.e is the text),
# we convert it to a temporary value of 2 to mark that we
# have visited it.
for i in visited:
img_arr[i[0],i[1]] = 2
img_arr = np.where(img_arr==2, 0, img_arr)
return img_arr
img = cv2.imread("temp.png")
# Convert to grayscale
c_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# Median filter
kernel = np.ones((3,3),np.uint8)
out = cv2.medianBlur(c_gray,3)
# Image thresholding
a = np.where(out>195, 1, out)
out = np.where(a!=1, 0, a)
# Islands removing with threshold = 30
out = removeIsland(out, 30)
# Median filter
out = cv2.medianBlur(out,3)
# Convert to Image type and pass it to tesseract
im = Image.fromarray(out*255)
print(pytesseract.image_to_string(im))
以上是此方法在輸出正確驗(yàn)證碼之前進(jìn)行的試驗(yàn)次數(shù)分布的直方圖。數(shù)據(jù)是我自己記錄的,因?yàn)槲覀人每天都使用這種方法超過 3 個月?梢钥闯,大多數(shù)試驗(yàn)次數(shù)低于 20,精確平均值為 9.02。結(jié)論本文中介紹的方法有一定的優(yōu)缺點(diǎn)。優(yōu)點(diǎn)是該方法不需要任何訓(xùn)練,因此不需要標(biāo)記數(shù)據(jù)集。計(jì)算速度快,實(shí)現(xiàn)簡單。然而,缺點(diǎn)是該方法是概率性的,因此對于在多次錯誤嘗試驗(yàn)證碼后阻止用戶的系統(tǒng),使用這種方法可能會鎖定你的帳戶。此外,該方法針對非常特定類型的驗(yàn)證碼,需要微調(diào),甚至可能不適用于其他類型的驗(yàn)證碼。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會
-
即日-5.15立即報(bào)名>>> 【在線會議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評 >> 【評選啟動】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?