改进OCR /图像识别的预处理

时间:2011-08-01 18:44:56

标签: c# image image-processing captcha ocr

目前,我对图像处理和光学字符识别有着极大的兴趣。经过一些基本的识别和一些过滤后,我决定开始更加困难的事情。

我正试图从这些验证码中读取价值: http://img851.imageshack.us/img851/9579/57859946.png

我已经为预处理编写了一些过滤器: - 替换颜色(白色)   删除蓝线   删除通过文本的行(两个) - 阈值图像(255)

Wich输出这样的图像; http://img232.imageshack.us/img232/2325/00i3q45j1zt.png

正如您所看到的,某些字母中有洞。我首先想到的可能是通过字母留下线条会更好但这会让情况更糟。我正在使用tesseract OCR引擎 我使用Elephant字体(验证码使用的字体)训练它。我也试过了 使用其他OCR引擎,如GOCR,但它会使一切变得更糟。有了tesseract,我现在有20%的认可。我在C#(.NET 4.0)中编码。

验证码由名为PHPCaptcha的软件包生成。

现在我的问题是: 是否有任何算法或刻度来填补字母中的孔?还有其他方法可以获得更好的认可吗?

我很高兴收到你们的来信:)

问候,

1 个答案:

答案 0 :(得分:2)


第0部分 - 前言


i)在此之前,您可能需要阅读我的OCR相关答案here,这可能会为您提供使用tesseract的一些技巧

ii)我假设您可以将所有内容都变成黑白(在您的情况下,处理颜色不会给您带来优势)


第1部分 - 预处理


在移除蓝线后填充“孔洞”。您可以随时扩张或执行“扩张 - 然后侵蚀”操作。在这里,扩张意味着您在8个方向上放大每个像素(制作更大的像素)。一旦你扩大了像素,看看你是否可以让它们被识别,或者看看角色是否“过度填充”(扩张太多)。如果无法识别字符或字符扩张太多,则可以应用侵蚀操作。当然有先进的综合算法,但我认为最好先从简单的图像处理操作开始。


第2部分 - OCR / Tesseract


使用Tesseract,如果您将整个图像输入Tesseract,它将执行线分析,依此类推。由于验证码中的字符不像普通文本那样,因此进行线分析或在组中识别它们可能会在一定程度上确定识别率。所以我的建议是先逐个字符地识别。