据我所知,我可以让Tesseract在单词级别,文本级别,段落级别,块级别返回文本。
我需要形成自己的单词集群,这可能是文本行的一部分或包含多行。一旦我拥有了这个词组,我想从左到右,从上到下组织它们以便于阅读。
我认为Tesseract具有这种能力,因为我可以使用正确级别的单词按顺序或段落级别取回文本级别单词。我可以从tess4j API访问此方法吗?
或者有人能指出我的算法,所以我可以自己实现它吗?
由于
修改 这是一个例子。假设我的图像有这个文本块
John Doe Adam Paul Sara Johnson
Vice President Director of IT Head of Human Resources
jdoe@xyz.com apaul@xyz.com sjohnson@xyz.com
如果我问tess4j文本级别的单词,那么我得到3行:
John Doe Adam Paul Sara Johnson
和
Vice President Director of IT Head of Human Resources
和
jdoe@xyz.com apaul@xyz.com sjohnson@xyz.com
相反,我想要的是
John Doe
Vice President
jdoe@xyz.com
和
Adam Paul
Director of IT
apaul@xyz.com
和
Sara Johnson
Head of Human Resources
sjohnson@xyz.com
答案 0 :(得分:1)
我编写了自己的算法来对单词进行排序。基本思想是比较器,从上到下,从左到右(当然是英语)来显示单词。
我使用单词的下边缘(即minY)进行比较,因为对于不同大小的单词,它应该大致相同,而对于较大的单词,上边缘(即maxY)可能更高。
我还允许在y轴比较中出现一些误差,因为图像可能会略微倾斜,或者OCR决定它想要稍微偏移绘制边界框。即。单词可能比同一行中的其他单词更高或更低。
new Comparator<Word>() {
@Override
public int compare(Word w1, Word w2) {
Rectangle b1 = w1.getBoundingBox()
, b2 = w2.getBoundingBox();
double yDiff = Math.abs(b1.getMinY() - b2.getMinY());
double marginDiff = b1.getHeight()/2.0;
if( yDiff < marginDiff ) {
int xDiff = Double.compare(b1.getMinX(), b2.getMinX());
return xDiff;
} else {
return Double.compare(b1.getMinY(), b2.getMinY());
}
}
}