使用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] 
+0

您是否尝试了不同的PSM模式? – nguyenq

+0

不幸的是,我需要的分割比我所描述的分割要复杂一点,它不是一种适合所有人的分割。有时,我需要整段和其他时间,我需要段落的第一句话,所以我有一个特殊的算法来聚集我的话。我只需要一些东西以人类可读的方式显示它们。我发布了一个合理运作良好的答案 – kane

我写我自己的算法进行排序的话。基本的想法是一个比较器,它显示从上到下,从左到右(当然是英语语言)的单词。

我使用单词的底部边缘(即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()); 
    } 
    } 
}