如何告诉 tesseract 不要忽略单词之间的空格?

Posted

技术标签:

【中文标题】如何告诉 tesseract 不要忽略单词之间的空格?【英文标题】:How to tell tesseract to not ignore blank spaces between words? 【发布时间】:2018-07-24 01:55:49 【问题描述】:

我正在尝试实现名片扫描应用程序。我正在使用 tesseract 库。

我阅读了有关提高 Tesseract 性能的文章,并且在将图像传递给 Tesseract 之前,我尝试了一些预处理图像。

我发现 Tesseract 最适合灰度/黑白图像。

我在选择正确的页面分段时遇到了问题。

到目前为止,

G8PageSegmentationModeSingleBlock(假设单个统一块 文字)

给了我名片格式的最佳结果。

以下是使用这种分割模式的结果:

灰度:

当使用灰度图像时,T​​esseract 正在识别单词(看红色矩形),但不知何故,有时它会识别单词之间的空间。

这是输出:

o
f l ,t!ti,iy,,,tyii,i,,!),i),,m,i,st,,,i,t,)) ',
REAL E:ESrry"irfEf
SOLUTIONS WC, n
TimTsai        ----> (space missing here)
Investor & Consultant
p 780.803.9935
f 888.803.1485
e tim@lnnoventionGroup.ca
w www.lnnoventionGroup.ca

黑白:

这在识别单词之间的空间方面比灰度要好一点,但这也将图像的边界识别为字母,并将它们附加到原始/实际文本中。 (看看红色矩形是如何延伸到图像边缘的,因为分割模式设置为识别统一的文本块)

这是输出:

o,
f I t,!h,tig/i,i,,ip,,ip,iy (,
REAL ESTATE i,
SOLUTIONS INC. (i,
Tim Tsai i;,      ------> (yay, got the space)
Investor & Consultant ii,
p 780.803.9935 :i,
f 888.803.1485 i:,
e tim@lnnoventionGroup.ca (i,
,
-ee_--e_-----e----------ir-eeeereree-e-re---------------, u p

我也试过去掉边框,这次没有读到单词之间的空格。

输出:

 o
I I !,,!ih,tle/IiEhp,tt,l,l),!
REAL ESTATE
SOLUTIONS INC.
TimTsai
Investor & Consultant
p 780.803.9935
f 888.803.1485
e tim@lnnoventionGroup.ca

问题:

这种行为的原因是什么(忽略单词之间的空格?)

我可以通过什么方式改进这一点,以便 tesseract 不会一直忽略空格?

我还可以查看旋转/去偏斜,但我不确定在这种情况下这可以提高多少性能,因为文本在我看来大多是水平的。

代码:

G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"];
tesseract.delegate = self;
tesseract.engineMode=G8OCREngineModeTesseractCubeCombined;

// Optional: Limit the character set Tesseract should try to recognize from
tesseract.charWhitelist = @"@.,&():ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ";

tesseract.charBlacklist=@"$%^*=;<>\\~`";

// Specify the image Tesseract should recognize on
    tesseract.image = [img g8_blackAndWhite];

tesseract.sourceResolution=kG8MaxCredibleResolution;


// Optional: Limit the area of the image Tesseract should recognize on to a rectangle
CGRect tessRect = CGRectMake(0, 0, tesseract.image.size.width, tesseract.image.size.height);

    tesseract.rect = tessRect;

// Optional: Limit recognition time with a few seconds
tesseract.maximumRecognitionTime = 60.0;

// Start the recognition
[tesseract recognize];

// Retrieve the recognized text
NSLog(@"text %@", [tesseract recognizedText]);

【问题讨论】:

查看this question参数。由于您的问题是相反的-尝试降低tosp_min_sane_kn_sp 尝试设置变量preserve_interword_spaces @nguyenq 怎么设置?在哪里设置? 类似的东西:tesseract.setVariable("preserve_interword_spaces", "1"); 【参考方案1】:

preserve_interword_spaces 设置为 true 以保留单词之间的多个空格。

您的代码可能如下所示:

tesseract.setVariable("preserve_interword_spaces", "1");

对于命令行界面,这样使用-c 开关:

tesseract image.jpg output -c preserve_interword_spaces=1

(来自有帮助的 cmets 的自愿回答;感谢用户 nguyenq)

【讨论】:

以上是关于如何告诉 tesseract 不要忽略单词之间的空格?的主要内容,如果未能解决你的问题,请参考以下文章

java servlet中的空指针异常[关闭]

vim拼写检查:忽略大写单词?

如何告诉 Fluent NHibernate 不要映射类属性

我如何告诉杰克逊忽略我无法控制源代码的属性?

如何忽略 Spring JPQL 中的空参数?

如何忽略 DataWeave Mule esb 中的空对象