簡體   English   中英

使用枕頭的CAPTCHA圖像處理

[英]CAPTCHAs Image Manipulation using Pillow

作為練習,我試圖打破以下驗證碼:

原始驗證碼

看起來好像很難斷裂,因為邊緣看起來相當牢固,並且噪聲應該相對容易消除。 問題是,我對圖像處理的經驗很少。 目前,我正在將Python與Pillow庫配合使用來操作CAPTCHA圖像,然后將其傳遞到Tesseract for OCR中。

在下面的代碼中,我嘗試通過銳化圖像並將圖像轉換為黑白來突出邊緣

from PIL import Image, ImageFilter

try:
    img = Image.open("Captcha.jpg")
except:
    print("Can't load captcha.")
    exit()


# Bring out the edges by sharpening.    
out = img.filter(ImageFilter.SHARPEN)
out = out.convert("L")

out = out.point(lambda x: 0 if x<136 else 255, "1")

width, height = out.size
out = out.resize((width*5, height*5), Image.NEAREST)

out.save("captcha_modified.png")

在這一點上,我看到以下內容:

修改后的驗證碼

但是,Tesseract仍然無法讀取字符。 作為實驗,我使用了出色的mspaint來手動修改圖像,使其達到Tesseract可以讀取的位置:

在此處輸入圖片說明

因此,如果可以使圖像達到這一點,我認為Tesseract將在檢測字符方面做得相當不錯。 因此,我目前的想法是我需要增強邊緣並減少圖像的噪點。 另外,我想如果將字母填充而不是概述,Tesseract會更容易檢測到字母,但是我不知道該怎么做。

關於如何進行此操作有什么建議嗎? 有沒有更好的方法來處理圖像?

我的時間很短,因此這個答案可能不是很有用,但完全可以參考我自己的兩種算法。 沒有太多的代碼,但有一些方法建議。 使用代碼而不是MS Paint是一個好主意,使用代碼實際上很容易破解驗證碼並獲得50%以上的成功率。 行為識別可能是更好的安全機制,也可能是其他機制。

A.您使用的邊緣檢測方法:

邊緣檢測確實不是必需的。 在這種情況下,只需使用getpixel((x,y))函數並填充邊界線之間的區域,即可識別出要填充的線1,3,5; etc。 並在交點2,4,6等后關閉填充。 幸運的是,您選擇了一個簡單的Captcha,因此邊緣檢測是一種不錯的解決方案,而不會造成混亂,旋轉和重新對齊。

B.操作方法:

我使用的另一種方法也是利用OpenCV和枕頭。 我真的很忙,但是稍后會在druid5.wordpress.com/上發布有關此內容的博客文章,其中將包含此方法的代碼示例。 由於通行證不是違法的,至少有人告訴我,我將使用將始終發布的方法來收集數據。 通常,枕頭上的對比度和細節,帶有統計數據的一些基本雜物去除,與基本dfs的重新對齊以及旋轉(對於opencv或對內核而言均可執行)。 Tesseract是開源的不錯選擇,但是用opencv創建OCR也不難。

這是對OpenCV,PIL(枕頭),帶有數學運算的圖像處理以及其他從機器人到AI的所有幫助的其他方面的不錯介紹。

可能有必要使用流量控制來發現故障情況並嘗試不同的路線,但目標始終應該是通用的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM