Javascript 将OCR非结构化文本转换为正确的文本
我在Javascript 将OCR非结构化文本转换为正确的文本,javascript,node.js,vb6,ocr,modi,Javascript,Node.js,Vb6,Ocr,Modi,我在VB6中使用MicrosoftMODI对图像进行OCR。(我知道其他OCR工具,如tesseract等,但我发现MODI比其他工具更准确) 要进行OCR的图像如下所示 LeftPos = Img.Layout.Words(0).Rects(0).Left TopPos = Img.Layout.Words(0).Rects(0).Top OCR后得到的文本如下所示 Text1 Text2 Text3 Number1 Number2 Number3 这里的问题是没有维护来自相反列的相应文
VB6
中使用MicrosoftMODI
对图像进行OCR。(我知道其他OCR工具,如tesseract等,但我发现MODI比其他工具更准确)
要进行OCR的图像如下所示
LeftPos = Img.Layout.Words(0).Rects(0).Left
TopPos = Img.Layout.Words(0).Rects(0).Top
OCR后得到的文本如下所示
Text1
Text2
Text3
Number1
Number2
Number3
这里的问题是没有维护来自相反列的相应文本。如何将数字1映射为文本1
我只能想出这样的解决办法
莫迪提供了所有像这样的OCR单词的坐标
LeftPos = Img.Layout.Words(0).Rects(0).Left
TopPos = Img.Layout.Words(0).Rects(0).Top
所以,为了对齐同一行中的单词,我们可以匹配每个单词的TopPos,然后按LeftPos对它们进行排序。我们将得到完整的线路。所以我循环遍历了所有的单词,并将它们的文本以及left和top存储在一个mysql表中。然后运行这个查询
SELECT group_concat(word ORDER BY `left` SEPARATOR ' ')
FROM test_copy
GROUP BY `top`
我的问题是,每个单词的顶部位置并不完全相同,显然会有几个像素的差异
我尝试添加div5
,用于合并5像素范围内的单词,但在某些情况下不起作用。我还尝试在node.js中计算每个单词的容差,然后按LeftPos排序,但我仍然觉得这不是最好的方法
更新:js代码完成了这项工作,但Number1有5个像素的差异,Text2在该行中没有对应的情况除外
有更好的方法吗?我不能100%确定如何识别“左”列中的单词,但一旦识别出该单词,您就可以在该行中找到其他单词,方法不仅是投影顶部坐标,还投影整个矩形(顶部和底部)。确定与其他单词的重叠(相交)。注意下面用红色标记的区域 这是可以用来检测是否有东西在同一条线上的公差。如果某个东西只重叠了一个像素,那么它可能来自较低或较高的线条。但如果它重叠了,比如说,50%或更多的高度“Text1”,那么它很可能在同一行上
基于上下坐标查找“行”中所有单词的SQL示例
select
word.id, word.Top, word.Left, word.Right, word.Bottom
from
word
where
(word.Top >= @leftColWordTop and word.Top <= @leftColWordBottom)
or (word.Bottom >= @leftColWordTop and word.Bottom <= @leftColWordBottom)
选择
word.id,word.Top,word.Left,word.Right,word.Bottom
从…起
单词
哪里
(word.Top>=@leftColWordTop和word.Top=@leftColWordTop和word.Bottom是始终存在的Text1
和Number1
(没有间隙或缺少值)?OCR软件是否将单词
按任何顺序排列?不,任何东西都可能存在,间隙,特殊字符等。一旦单词排成一行,我就有其他逻辑来解析其中有意义的信息。我不确定顺序,但无论如何,按LeftPos排序都无关紧要。问题是TopPos的例:顶部4-6(考虑到公差为3)的单词应该放在同一行。感谢您阅读整个问题:)。我理解这个概念,我也有制作矩形投影的所有坐标,但我如何合乎逻辑地做到这一点?我的意思是我只需要用他们的X和Y来表达。我认为在单词之间寻找重叠太慢了。你可以在代码或数据库中完成。我不知道你的数据库,但看看上面的编辑。