我正在处理一种带有一些嘈杂条纹的验证码。它们是随机抽取的,它们是笔直的。数字和条纹的颜色是真正随机的。
以下代码可以在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%,但我在思考如果有其他方法可以删除条纹而不会模糊数字。
任何提示都受到高度赞赏。
答案 0 :(得分:3)
为什么不尝试利用条纹有多薄?我猜他们最多是5px。那么为什么不做类似(粗糙伪代码)的事情:
numpy
数组direction
中的UP, DOWN, LEFT, RIGHT
numpy
中将新的direction
数组移动5px,裁剪边缘。鉴于这些数字比条纹厚得多,我的猜测是清除图像中的条纹将超过AND引入的任何失真。
答案 1 :(得分:1)
第二个样本非常简单:扫描边缘以识别条纹的颜色并将此颜色变为白色。 (这些彩色线条不是强大的验证码功能。)
第一个和第三个引发了一个更严重的问题,因为条纹的颜色与某些字符相同。您可以通过仅擦除具有少量邻居的条纹颜色的像素来处理该问题。更好的方法是分析图像轮廓以识别条纹的方向,并查看邻域配置对应条纹像素。
从技术上讲,您将使用合适的结构元素形状执行侵蚀操作。
答案 2 :(得分:1)
图像处理中存在一类名为“修复”的数学问题。
你应该以某种方式获得条纹面具。
这是我的文章库:http://dpaste.com/0CZ25FT。所有现代出版物都在那里。
在OpenCV中实现了几种算法:“Navier-Stokes”和“Telea”,但它们不适合修复大区域。
您还可以在SciKit中找到一些修复内容,但没有完成算法。
此外,如果条纹总是1像素宽,可以通过扩张+侵蚀轻松去除它们。检查Woods,Gonzalez“数字图像处理”了解更多信息。