对验证码进行去噪处理

时间:2014-06-18 07:52:59

标签: python python-imaging-library

我正在处理一种带有一些嘈杂条纹的验证码。它们是随机抽取的,它们是笔直的。数字和条纹的颜色是真正随机的。

enter image description here enter image description here enter image description here

以下代码可以在tesseract的帮助下recognize digits from some captchas

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%,但我在思考如果有其他方法可以删除条纹而不会模糊数字。

任何提示都受到高度赞赏。

3 个答案:

答案 0 :(得分:3)

为什么不尝试利用条纹有多薄?我猜他们最多是5px。那么为什么不做类似(粗糙伪代码)的事情:

  1. 将图片转换为numpy数组
  2. direction中的UP, DOWN, LEFT, RIGHT
    1. numpy中将新的direction数组移动5px,裁剪边缘。
    2. 将您的新阵列和旧阵列放在一起。
    3. 检查左下角。如果它是白色的,那么你的完成和你的图像被去噪。如果没有,请尝试下一个方向。
  3. 鉴于这些数字比条纹厚得多,我的猜测是清除图像中的条纹将超过AND引入的任何失真。

答案 1 :(得分:1)

第二个样本非常简单:扫描边缘以识别条纹的颜色并将此颜色变为白色。 (这些彩色线条不是强大的验证码功能。)

第一个和第三个引发了一个更严重的问题,因为条纹的颜色与某些字符相同。您可以通过仅擦除具有少量邻居的条纹颜色的像素来处理该问题。更好的方法是分析图像轮廓以识别条纹的方向,并查看邻域配置对应条纹像素。

从技术上讲,您将使用合适的结构元素形状执行侵蚀操作。

答案 2 :(得分:1)

图像处理中存在一类名为“修复”的数学问题。

你应该以某种方式获得条纹面具。

这是我的文章库:http://dpaste.com/0CZ25FT。所有现代出版物都在那里。

在OpenCV中实现了几种算法:“Navier-Stokes”和“Telea”,但它们不适合修复大区域。

您还可以在SciKit中找到一些修复内容,但没有完成算法。

此外,如果条纹总是1像素宽,可以通过扩张+侵蚀轻松去除它们。检查Woods,Gonzalez“数字图像处理”了解更多信息。