我正在处理一种带有一些嘈杂条纹的验证码。它们是随机绘制的,而且是直的。数字和条纹的颜色是真正随机的。
下面的代码能够recognize digits from some captchas在 tesseract
的帮助下。
from pytesser.pytesser import *
from PIL import Image, ImageFilter, ImageEnhance
im = Image.open("test.tiff")
im = im.filter(ImageFilter.MedianFilter()) # blur the image, the stripes will be erased
im = ImageEnhance.Contrast(im).enhance(2) # increase the contrast (to make image clear?)
im = im.convert('1') # convert to black-white image
text = image_to_string(im)
print "text={}".format(text)
去除条纹的方法是先模糊图像再锐化。大多数情况下识别的准确率是100%,但我在想如果有还有一些其他方法可以在不模糊数字的情况下去除条纹。
非常感谢任何提示。
最佳答案
为什么不尝试利用条纹的细度呢?我猜他们最多 5px。那么为什么不做类似的事情(粗略的伪代码):
- 将您的图像转换为
numpy
数组 - 用于
UP、DOWN、LEFT、RIGHT
中的方向
- 制作一个新的
numpy
数组,在direction
上移动 5px,裁掉边缘。 - 并将新数组和旧数组放在一起。
- 检查左下角。如果它是白色的,你就完成了,你的图像被去噪了。如果没有,请尝试下一个方向。
- 制作一个新的
鉴于数字比条纹粗得多,我的猜测是从图像中清除条纹会超过 AND 引入的任何失真。
关于python - 验证码的去噪条纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24279918/