使用tess4j,我怎样才能访问方法来结合单词
问题描述:
我明白,我可以要求Tesseract在单词级别,文本级别,段落级别,块级别返回文本。使用tess4j,我怎样才能访问方法来结合单词
我需要形成自己的单词集,它可以是文本行的一部分或包含多行。一旦我有这样的词组,我希望从左到右,从上到下地组织它们以提高可读性。
我认为Tesseract具有这种能力,因为我可以按照顺序或段落级别返回文本级别的词,并且词级处于正确的级别。我可以从tess4j API访问此方法吗?
或者有人可以指点我的算法,这样我就可以自己实现它了吗?
感谢
编辑 下面是一个例子。假设我的形象有文字
John Doe Adam Paul Sara Johnson
Vice President Director of IT Head of Human Resources
[email protected] [email protected] [email protected]
的此块如果我要一个TextLine水平的话tess4j,然后我得到3行:
John Doe Adam Paul Sara Johnson
和
Vice President Director of IT Head of Human Resources
和
[email protected] [email protected] [email protected]
而是我想要的是
John Doe
Vice President
[email protected]
和
Adam Paul
Director of IT
[email protected]
和
Sara Johnson
Head of Human Resources
[email protected]
答
我写我自己的算法进行排序的话。基本的想法是一个比较器,它显示从上到下,从左到右(当然是英语语言)的单词。
我使用单词的底部边缘(即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());
}
}
}
您是否尝试了不同的PSM模式? – nguyenq
不幸的是,我需要的分割比我所描述的分割要复杂一点,它不是一种适合所有人的分割。有时,我需要整段和其他时间,我需要段落的第一句话,所以我有一个特殊的算法来聚集我的话。我只需要一些东西以人类可读的方式显示它们。我发布了一个合理运作良好的答案 – kane