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

时间:2014-12-04 15:43:14

标签: c++ opencv tesseract

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

2 个答案:

答案 0 :(得分:1)

我要剪切你的输入图像,你需要检测文本行。如果打字并且线条大部分是直的,那应该很容易。处理不直接或手写的扫描不容易处理!最后一点需要注意的是:只有在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和average是足够大的类型来支持(大得多)计算结果。

如您所见,这决定了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的权重,而远离X的权重给出0.5的权重。这样,距离较远的*可以是两次暗,而X仍然被认为是白色。

答案 1 :(得分:0)

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

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

此链接可能会帮助您。

决定你计划如何拆分你的文本,然后将它全部传递到你需要的线程/块数的CUDA内核中并在那里执行OCR。

我害怕你提供的这些信息很少,我可以提供更多的帮助。