扫描名片 Tesseract 和 Leptonica iOS

4

我正在尝试使用tesseract OCR扫描名片,我所做的就是将图像发送进去,没有进行任何预处理,这是我正在使用的代码。

 Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:@"eng+ita"];
tesseract.delegate = self;
[tesseract setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@.-()" forKey:@"tessedit_char_whitelist"];

[tesseract setImage:[UIImage imageNamed:@"card.jpg"]]; //image to check
[tesseract recognize];

 NSLog(@"Here is the text %@", [tesseract recognizedText]);

卡片图片

这是输出结果

如您所见,准确度不是100%,但这并不是我关心的问题,我认为可以通过一些简单的预处理来解决。然而,如果您注意到它将底部两个文本块混合在一起,就会分割地址,并可能分割其他卡上的信息。

我怎样才能使用Leptonica(或其他可能是OpenCV)来以某种方式对文本进行分组?可能单独向Tesseract发送图像上的文本区域进行扫描? 我已经卡在这个问题上很长时间了,欢迎任何可能的解决方案!

4个回答

1
我建议使用一种名为“Run Length Smoothing Algorithm”(RLSA)的算法。这个算法在很多文档图像处理系统中被使用,虽然并不是每个系统都将其作为API的一部分公开。 原始论文 发表于1982年,需要付费。但是,同样的算法被许多其他文档图像处理论文引用,在这些论文中可以轻松找到实现细节和改进。
其中一篇论文是:http://www.sciencedirect.com/science/article/pii/S0262885609002005 基本思想是逐行扫描文档图像,记录字母之间间隙的宽度。
然后,通过过滤间隙的宽度并将小间隙设置为与文本相同的颜色,可以组合附近的文本字符。结果将是代表大型连接组件的形式:
  • 文字,
    • 通过缩小字符之间的间隙,
  • 文本行,
    • 通过缩小单词之间的间隙,以及
  • 段落
    • 通过逐列扫描,然后缩小文本行之间的垂直间隙。

如果您没有访问任何公开此功能的文档图像分析库,则可以模仿效果:

  • 使用形态学运算(形态学闭合),然后
  • 对结果执行连通组件标记。

大多数图像处理库(如OpenCV)提供此类功能。采用此方法可能效率较低,因为您将不得不使用不同的文本间隙大小重新运行算法以实现不同级别的聚类,除非用户向您的应用程序提供文本间隙大小。


0
您可以尝试使用HOCRText,它会将扫描的所有单词以及每个单词在图像中的框架作为xml返回。
char *boxtext = _tesseract->GetHOCRText(0);

您可以解析该XML以获取每个单词及其框架。 否则,如果需要,您可以在图像中提及应该进行Tesseract扫描的框架。

_tesseract->SetRectangle(100, 100, 200, 200);

在调用识别之前,请设置此帧。这样,Tesseract 将仅扫描该帧并返回该帧的文本。

0

我认为你已经碰到了OCR的一个根本性问题 - 这种类型的印刷设计使用空白作为有意义的分隔符,但OCR软件不理解或无法理解。

这只是一次瞎猜,但以下是我会尝试的方法:

从左上角开始,建立一个盒子,大小可能是整个图像的1-5%。将其发送到OCR,看看是否返回了有意义的内容。如果没有,请扩展盒子直到获得有意义的内容。

一旦你有了一些内容,就开始以合理的单位扩大该块,直到不再获得新数据为止。你可以希望决定这一点是“有意义的空白”,现在你可以将此处理后的文本视为“一个块”,因此完成。现在开始处理图像中未处理的下一个部分,然后依此类推,直到整个图像完成。

通过使用一组相互链接的扩展框,希望您只能获得有意义的数据块组合在一起。以您的示例为例,一旦您隔离出徽标并处理它(以及结果的胡言乱语),下一个框将以Noah中的“N”开头。然后向右扩展,直到获得整个名称。

完成这个步骤后,您可以再次尝试,希望您能得到一个包含“Associate”中的“A”的边界框,并获得整行。

逐像素进行处理会花费太长时间,需要运行OCR,但在“每个间隔扩展的块大小”和“所需处理量”之间肯定会有权衡。

我不明白为什么这种方法不能用于相对正常的印刷设计,比如普通风格的商务卡片。


你认为使用hOCR来查找文本位置是可能的吗? - user3247146
1
@npor19 我想知道OCR程序本身是否有某种反馈可用,或许允许映射文本来自何处,这肯定会使事情变得更容易。但我对其实现及其API不熟悉,所以您需要查阅相关文档。在某些方面,这将使事情更容易,或者至少更有效率...但该程序可能无法提供这样的定义行为。 - BrianH

0

在 Github 上有一个示例 iOS 应用程序可以帮助您完成此操作:

https://github.com/danauclair/CardScan

他是如何读取名片信息的?他会写下以下代码(或者你可以在文件中阅读:https://github.com/danauclair/CardScan/blob/master/Classes/CardParser.m
//  A class used to parse a bunch of OCR text into the fields of an ABRecordRef which can be added to the 
//  iPhone address book contacts. This class copies and opens a small SQLite databse with a table of ~5500
//  common American first names which it uses to help decipher which text on the business card is the name.
//
//  The class tokenizes the text by splitting it up by newlines and also by a simple " . " regex pattern.
//  This is because many business cards put multiple "tokens" of information on a single line separated by 
//  spaces and some kind of character such as |, -, /, or a dot.
//
//  Once the OCR text is fully tokenized it tries to identify the name (via SQLite table), job title (uses 
//  a set of common job title words), email, website, phone, address (all using regex patterns). The company
//  or organization name is assumed to be the first token/line of the text unless that is the name.
//
//  This is obviously a far from perfect parsing scheme for business card text, but it seems to work decently
//  on a number of cards that were tested. I'm sure a lot of improvements can be made here.

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