简单的验证码解决

Meh*_*rki 9 captcha python-tesseract opencv-python

我正在尝试使用 OpenCV 和 pytesseract 解决一些简单的验证码。一些验证码样本是:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

我试图用一些过滤器去除嘈杂的点:

import cv2
import numpy as np
import pytesseract

img = cv2.imread(image_path)
_, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, np.ones((4, 4), np.uint8), iterations=1)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imwrite('res.png', img)
print(pytesseract.image_to_string('res.png'))
Run Code Online (Sandbox Code Playgroud)

结果转换后的图像是:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

不幸的是,pytesseract 只能正确识别第一个验证码。还有其他更好的改造吗?

最终更新:

正如@Neil 所建议的那样,我尝试通过检测连接的像素来消除噪声。为了找到连接的像素,我找到了一个名为 的函数connectedComponentsWithStats,它检测连接的像素并为组(组件)分配一个标签。通过查找连接组件并删除具有少量像素的组件,我设法使用 pytesseract 获得了更好的整体检测精度。

这是新的结果图像:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

Nei*_*eil 2

我采取了一种更直接的方法来过滤 pdf 文档中的墨迹。我不会分享整个事情,因为有很多代码,但这是我采用的总体策略:

  1. 使用 Python Pillow 库获取可以直接操作像素的图像对象。
  2. 对图像进行二值化。
  3. 找出所有连通像素以及每组连通像素中有多少个像素。您可以使用扫雷算法来做到这一点。这很容易搜索。
  4. 设置所有合法字母都应具有的像素阈值。这将取决于您的图像分辨率。
  5. 将低于阈值的组中的所有黑色像素替换为白色像素。
  6. 转换回图像。