【问题标题】:CAPTCHAs Image Manipulation using Pillow使用 Pillow 进行 CAPTCHA 图像处理
【发布时间】:2025-12-13 05:00:01
【问题描述】:

作为练习,我正在尝试破解以下验证码:

它似乎不太难打破,因为边缘似乎相当坚固,而且噪点应该相对容易去除。问题是,我对图像处理的经验很少。目前我正在使用 Python 和 Pillow 库来操作 CAPTCHA 图像,之后它将被传递到 Tesseract 进行 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 仍然无法读取字符。作为一个实验,我使用 good ol' mspaint 手动将图像修改为可以被 Tesseract 读取的点:

因此,如果可以将图像做到这一点,我认为 Tesseract 在检测字符方面会做得相当好。所以我目前的想法是我需要增强边缘并减少图像的噪点。另外,我想如果字母将被填充而不是轮廓,Tesseract 会更容易检测到这些字母,但我不知道我会如何做到这一点。

关于如何解决这个问题有什么建议吗?有没有更好的方法来处理图像?

【问题讨论】:

  • 没有更多有用的练习吗?
  • 可能,但我从事安全工作,所以我特别感兴趣。

标签: python image-processing python-imaging-library captcha


【解决方案1】:

我的时间很短,所以这个答案可能不是非常有用,但完全涵盖了我自己的 2 个算法。代码不多,但有一些方法推荐。使用代码而不是 MS Paint 是个好主意。使用代码实际上很容易破解验证码并达到 50% 以上的成功率。行为识别可能是一种更好的安全机制,也可能是一种附加机制。

A.您使用的边缘检测方法:

确实不需要边缘检测。在这种情况下,只需使用 getpixel((x,y)) 函数并填充边界线之间的区域,识别在第 1、3、5 行等处进行填充。并在交叉点 2、4、6 后关闭填充;等。幸运的是,您选择了简单的验证码,因此边缘检测是一个不错的解决方案,无需整理、旋转和重新对齐。

B.操作方法:

我使用的另一种方法也使用 OpenCV 和枕头。我真的很忙,但稍后会在 druid5.wordpress.com/ 上发布一篇关于此的博客文章,其中将包含此方法的代码示例。由于通过它们并不违法,至少我被告知,我一直使用我将发布的方法来收集数据。大多数情况下,来自枕头的对比和细节,一些基本的杂乱数据去除,使用基本的 dfs 重新对齐,以及旋转(可以使用 opencv 或轻松使用内核执行)。 Tesseract 是开源的不错选择,但使用 opencv 创建 OCR 也不是太难。

本练习很好地介绍了 OpenCV、PIL(枕头)、数学图像处理以及其他一些有助于从机器人技术到 AI 的一切事物。

使用流控制来查找失败的条件并尝试不同的路线可能是必要的,但目标应该始终是一个通用的解决方案。

【讨论】:

    最近更新 更多