繁体   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