Tesseract OCR库 - 学习字体

16

我正在使用编译好的.NET版本OCR,可以在http://www.pixel-technology.com/freeware/tessnet2/找到。

我已经让它工作了,但是这个OCR的目的是翻译车牌号码,不幸的是,引擎不能准确地翻译一些字母,例如,这里有一张图片,我扫描出了字符问题:

enter image description here

结果如下:

12345B7B9U ABCDEFGHIJKLMNUPIJRSTUVHXYZ

因此以下字符被错误地翻译:

1、O、Q、W

这看起来不太严重,但是对于我的车牌号码来说,结果并不理想:

enter image description here = H4 ODM

enter image description here = LDH IFW

虚假测试

enter image description here = NR4 y2k

你可能已经注意到了,我尝试了降噪、增加对比度和去除不是绝对黑色的像素,但没有什么实质性的改善。

显然,你可以“教”引擎新字体,但我认为我需要重新编译.NET库,而且这似乎是在Linux操作系统上执行的,我没有这个系统。

http://www.scribd.com/doc/16747664/Tesseract-Trainingfor-Khmer-LanguageFor-Posting

所以我不知道下一步该怎么办,我写了一个快速测试控制台应用程序,如果有人想尝试它,请随便试试。 如果有任何想法/图形操作/库想法,我很乐意听到它们。


这里又出现了一个问题:字母 O 和数字 0 的形状完全相同,因此 OCR 引擎无法正确识别它们。 - Martin Thurau
是的,我注意到了,简直不敢相信它们的形状完全一样。无论如何,我已经想出了一种处理这个问题的方法,不需要使用OCR,所以没问题。 - Ash
@Martin Thurau:错了!在文本字体中,0和O大多数情况下是不同的 - 幸运的是!因此,如果您对该字体进行特殊训练,您应该能够区分它们,这就是我的情况。当然,如果您事先不知道字体,那么这可能会更加困难。 - Emmanuel
1
@Emmanuel,我认为Martin在谈论这个问题的特定字体。 - korbes
@korbes:感谢您提到这一点,当然在这种情况下,区分确实会非常困难... :-) - Emmanuel
7个回答

28

我最近使用了Tessnet2中的Tesseract(如果我没记错,Tessnet2是由Rémy Thomas制作的一个VS2008 C++封装器)。让我试着帮助你理解这个工具:

  • 首先,正如我上面所说,这个封装器仅适用于Tesseract 2.0版本,而在Google Code上的最新Tesseract版本是3.00版本(代码不再托管在Source Forge上)。有定期的贡献者:我看到计划发布版本3.01等。因此,您没有享受到最新的增强功能,包括页面布局分析,这可能有助于当您的车牌不是100%水平时。

  • 我询问了Rémy是否会为版本3提供Tessnet2 .NET封装器,他目前没有计划。因此,像我一样,您将不得不自己完成!

  • 因此,如果您想获得最新的源代码,请从Subversion存储库中下载它们(所有内容都在专用站点页面上描述),如果您有Visual Studio 2008,则可以编译它们,因为这些源代码包含vs2008子文件夹中的VS2008解决方案。该解决方案由VS2008 C++项目组成,因此,如果要在C#中获得结果,则必须使用该项目构建的tessDll进行.NET P/Invoke。同样,如果您需要此功能,我有可能会对您有用的代码示例,但是您可能希望使用C++并自己创建新的WinForm项目!

  • 当你成功编译后(大部分情况下都不会有大问题,但如果你遇到了问题,请告诉我,我也可能遇到过:-)),输出会产生几个可执行文件,这些文件将使你能够进行特定的训练!同样,Tesseract 3有一专门页面用于Tesseract 3训练。通过这个训练,你可以:

    • 限制你的字符集,这将自动删除标点符号(例如,使用 '/-\'代替 'A')。

    • 指示你检测到的模糊字符(例如,使用 'D'代替'O',使用'B'代替'8'等),这将在你使用训练时被考虑进去。

  • 我还发现,如果限制图像仅包含字母的区域(即没有人脸,周围的风景等),Tesseract的结果会更好:在我的情况下,我需要识别从网络摄像头拍摄的卡片照片的特定区域,因此我使用图像处理来限制区域。当然,那需要很长时间,因为我的图像来自许多不同的来源,所以我别无选择。如果你能够获得最小限度的图像,那将是非常好的!

  • 我希望这对你有所帮助,如果你有任何疑问,请随时与我联系!


    非常感谢您的全面回复!我在想,如果与字体样式相关的更改已被替换,Tesseract 3可能有助于识别,尽管我怀疑这是否是情况。正如您所提到的,代码可在VS2008中使用,因此不需要包装器,但我不知道如何进行.NET P/Invoke,特别是对于这个库,因此,如果您能提供任何建议,包括将功能编译为类似Tessnet2的DLL,那就太好了! - Ash
    1
    P/Invoke是在托管代码(如C#,VB)和非托管DLL(例如此VS2008项目中的非托管C ++)之间进行通信的一种方式。我不得不使用它来与C#进行接口,但如果您只使用C ++,则无需使用P / Invoke。现在,如果您确实需要它,我会向您展示一个例子! - Emmanuel
    1
    “专门用于Tesseract 3训练的页面链接不再可用。” - hpopiolkiewicz

    11

    嗨,我已经用Tesseract进行了很多OCR,我也遇到了一些你的问题。你询问有关图像处理工具的问题,我建议使用“unpaper”(也有Windows端口,请参见谷歌)。这是一个很好的去偏斜、去旋转、去边框和噪音等程序,非常适合在OCR之前运行。

    如果您的图像有(或比较)可变的背景颜色,我建议使用"textcleaner" ImageMagick脚本。我认为它检测边缘并将所有非边缘内容变白。

    如果您有复杂的文本,则“ocropus”可能有用。语法是(在Linux上):“ocroscript rec-tess"

    我的设置是: 1. textcleaner 2. unpaper 3. ocroups

    通过这三个步骤,我几乎可以读取任何东西。即使是在不均匀照明下拍摄的模糊+嘈杂图像,带有两列紧密排列的文本,也可以非常清晰地识别出来。好吧,也许您的需求不是那么多文本,但步骤1)和2)可能对您有用。


    1
    你的链接“unpaper”无法使用。另外,我想请教您关于我的一个问题http://stackoverflow.com/questions/25668203/tesseract-improvements-and-image-pre-processing-steps的建议。 - 2vision2
    我有另一个问题。我的意图是检测身份证中的姓名和字符。我已经使用了“int tesseract::TESSDLL_API::MeanTextConf”来获取置信度分数。对于每个字符的这个置信度分数,是否有可能决定如果置信度分数高于某个百分比,则识别出的字符是准确的?如果我错了,请问您能否解释一下“MeanTextConf”方法的用途? - 2vision2

    3

    我目前正在为ispy构建一个车牌识别引擎 - 当我将车牌分成单个字符并构建新的垂直显示的图像时,我从tesseract获得了更好的结果,周围留有白色空间,如下所示:

    W

    4

    O

    O

    M

    我认为Tesseract存在的一个大问题是它试图从水平的字母和数字中识别单词,在车牌等字母和数字混合的情况下,它会将数字识别为字母或反之亦然。如果输入一张垂直排列的字符图像,则它会将它们视为单个字符而不是文本。


    2

    一篇很好的阅读材料!http://robotics.usc.edu/publications/downloads/pub/635/

    关于车牌倾斜问题:

    问题:当OCR输入来自手持相机或其他像扫描仪那样视角不固定的成像设备时,文本行可能会偏离其原始方向[13]。根据我们的实验,在将这种旋转图像输入到OCR引擎中后,产生的结果极差。 提出的方法:在调用识别引擎之前需要进行倾斜检测过程。如果检测到任何倾斜,则执行自动旋转程序以在进一步处理文本之前纠正倾斜。在确定用于检测倾斜的算法时,我们发现许多方法(例如[13]中提到的方法)是基于文档具有固定边距的假设。但是,在我们的应用中,这种假设并不总是成立。此外,基于形态学操作和投影方法的传统方法极其缓慢,并且容易在存在相机捕获的图像时失败。在这项工作中,我们选择了一种更加健壮的方法,它基于基于分支限界文本行查找算法(RAST算法)[25]进行倾斜检测和自动旋转。该算法的基本思想是独立识别每一行,并使用最佳评分线的斜率作为整个文本段的倾斜角度。在检测到倾斜角度后,相应地执行旋转。根据我们的实验,我们发现这种算法非常健壮且极其高效快速。但是,它在某种意义上受到一个小限制,即无法检测大于30度的旋转。我们还尝试了另一种方法,可以检测任何旋转角度高达90度。然而,这种方法基于图像上存在某种交叉点。由于缺乏可扩展性,我们决定坚持使用RAST算法。


    1
    如果有人从未来看到这个问题,有一个名为jTessBoxEditor的工具可以轻松地教授Tesseract。你只需要将其指向包含示例图像的文件夹,然后点击一个按钮,它就会为您创建*.learneddata文件。

    1

    0
    ABCocr .NET使用Tesseract3,如果您需要在.NET下使用最新的代码,那可能是合适的选择。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接