通过发送文本块/段落来并行化 OCR
Parallelise OCR by sending blocks/ paragraphs of text
我希望通过将文本块单独发送到 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。
恐怕你提供的信息这么少,我真的不能比这更能帮助了。
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- 将 for 循环与嵌套的 while 循环并行化时出现 OpenMP 分段错误
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- 通过发送文本块/段落来并行化 OCR