通过发送文本块/段落来并行化 OCR

Parallelise OCR by sending blocks/ paragraphs of text

本文关键字:段落 并行化 OCR 文本      更新时间:2023-10-16

我希望通过将文本块单独发送到 OCR 而不是发送一个文本图像来提高对文本图像执行 OCR 的速度。我该怎么做?

我为了剪切您的输入图像,您需要检测文本行。如果打字并且线条大多是直的,应该很容易。不直接或手写的扫描不容易处理!最后要注意的是:在这种情况下,只有更高DPI的扫描才会合作(我会说至少300 DPI(。

否则,就是从顶部找到一条"非白线"扫描,这是你的

第一行开始的地方,然后找到下一条"白线",也就是你的线的垂直端。

然而。。。OCR 不仅扫描图像,还会解释结果。因此,如果你的行以部分单词("extrac-"(结尾,它能够在下一行的开头找到单词的结尾("-ting"(。

如果您剪切并尝试逐行处理这些行,您将错过所有这些行(在许多文档中没有使用,因此您可能没问题。


什么是"白线"?

在这里,我假设您的文档是白纸上的黑色墨水。扫描文档时,白纸在图像中显示为浅灰色。这个想法很简单:计算X个像素的平均值,看看它们的亮或暗,如果足够亮,那么认为它是白色的。

quick_gray = (r + g + b) / 3;  // this is not a correct gray computation, but good enough here (and relatively fast.)
average = (qg1 + qg2 + qg3 + ... + qgN) / N;  // the average of 9 or 25 pixels
if(average < 40) { goto white_pixel; }

可以跳过这些划分以使事情进展得更快,因为您可以将平均测试重写为:

if(average < 40 * 3 * N) { ... }

这是假设quick_gray和平均值是足够大的类型,可以支持(更大的(计算结果。

如您所见,这决定了 PIXEL 是否为白色,而不是线条。你必须对整条线的每个像素重复这个数学运算,才能知道整个东西是否是白色的。

有问题的像素是下面的 X,* 代表区域检查(N = 5 x 5 = 25 像素(。

o o o o o o o o o
o o * * * * * o o
o o * * * * * o o
o o * * X * * o o
o o * * * * * o o
o o * * * * * o o
o o o o o o o o o

也可以使用权重系统,其中远离中心的像素不会对结果产生太大影响。因此,X 周围的 * 可以给出 0.9 的权重,而更远的 * 可以给出 0.5 的权重。这样,距离较远的 * 可以暗两倍,X 仍将被视为白色。

我建议查找一些C++ CUDA 示例以获得并行编程语法的基本概念。

http://llpanorama.wordpress.com/2008/05/21/my-first-cuda-program/

此链接可能会在这里为您提供帮助。

决定您计划如何拆分文本,然后将其全部传递到具有所需线程/块的 CUDA 内核中,并在其中执行 OCR。

恐怕你提供的信息这么少,我真的不能比这更能帮助了。