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

Posted

技术标签:

【中文标题】改进 OCR/图像识别的预处理【英文标题】:Improve pre-processing for OCR/Image Recognition 【发布时间】:2011-10-17 16:31:00 【问题描述】:

目前我对图像处理和光学字符识别非常感兴趣。经过一些基本的认识和一些过滤后,我决定开始做一些更困难的事情。

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

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

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

如您所见,有些字母有孔。我首先认为也许最好将线条留在字母中,但这会使情况变得更糟。我正在使用 tesseract OCR 引擎 我使用大象字体(验证码使用的字体)对其进行了训练。我也试过 使用其他 OCR 引擎,如 GOCR,但这会让一切变得更糟。有了 tesseract,我现在有 20% 的认可度。我正在使用 C# (.NET 4.0) 进行编码。

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

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

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

您好,

【问题讨论】:

【参考方案1】:

第 0 部分 - 前言


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

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


第 1 部分 - 预处理


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


第 2 部分 - OCR/Tesseract


使用 Tesseract,如果您将整个图像输入 Tesseract,它将执行线分析等等。由于验证码中的字符与普通文本的行为不同,因此进行行分析或在组中识别它们可能会降低识别率。所以我的建议是先逐个字符识别。

【讨论】:

考虑到遮挡线的粗细,可能需要使用对部分遮挡(基于字符映射的东西)具有鲁棒性的字符匹配算法。预处理很难“改善”字符的状况,因为遮挡会显着改变形状的轮廓。困难之一是“大象”字体有很粗和很细的笔画。删除细笔画将删除区分单个字符的显着特征。 对不起,我忘了说我已经编写并尝试过侵蚀和膨胀过滤器,但效果很小。你有更多的信息合成算法吗? Perphaps 一些代码示例(任何语言?)。关于 tesseract:问题是如何从图像中抓取字符。他们从来不在同一个地方。当我尝试使用 tesseract 识别其中一个验证码时,我在图像上绘制矩形以显示 tesseract 如何识别字符。通常它将两个字符视为一个字符。 @Gary Tsui 你能添加一个链接到你所指的综合算法吗? Google 为我提供了语音合成和声波结果。

以上是关于改进 OCR/图像识别的预处理的主要内容,如果未能解决你的问题,请参考以下文章

论图像识别的预处理技术

论图像识别的预处理技术

OCR识别技术文档识别怎么用

使用 Tesseract 进行鸡蛋标记识别的图像预处理

图像和图像识别数据

有用过tesseract OCR字符识别的吗?怎么识别率那么低