2017-05-31 2 views
0

Je comprends que je peux demander à Tesseract de renvoyer le texte au niveau des mots, au niveau de la ligne de texte, au niveau du paragraphe et au niveau du bloc.En utilisant tess4j, comment puis-je accéder à la méthode pour combiner les mots

J'ai besoin de former mon propre groupe de mots, qui peut être une partie d'une ligne de texte ou inclure plusieurs lignes. Une fois que j'ai ce groupe de mots, je voudrais les organiser de gauche à droite, de haut en bas pour la lisibilité.

Je suppose que Tesseract a cette capacité puisque je peux récupérer des mots de niveau de ligne dans l'ordre ou le niveau de paragraphe avec des mots dans le bon niveau. Puis-je accéder à cette méthode depuis l'API tess4j?

Ou quelqu'un peut-il me diriger vers l'algorithme pour que je puisse l'implémenter seul?

Merci

Modifier Voici un exemple. Supposons que mon image a ce bloc de texte

John Doe    Adam Paul    Sara Johnson 
Vice President   Director of IT  Head of Human Resources 
[email protected]   [email protected]   [email protected] 

Si je demande tess4j des mots de niveau TextLine, je reçois 3 lignes:

John Doe Adam Paul Sara Johnson 

et

Vice President Director of IT Head of Human Resources 

et

[email protected] [email protected] [email protected] 

Au lieu de ce que je veux est

John Doe  
Vice President 
[email protected] 

et

Adam Paul 
Director of IT 
[email protected] 

et

Sara Johnson 
Head of Human Resources 
[email protected] 
+0

Avez-vous essayé différents modes PSM? – nguyenq

+0

Malheureusement, la segmentation dont j'ai besoin est un peu plus complexe que ce que j'ai décrit et ce n'est pas une taille unique. Parfois, j'ai besoin d'un paragraphe entier et d'autres fois, j'ai besoin de la première phrase du paragraphe pour avoir un algorithme spécial qui regroupe mes mots. J'avais juste besoin de quelque chose pour les afficher d'une manière lisible par l'homme. J'ai posté une réponse qui fonctionne raisonnablement bien – kane

Répondre

1

J'ai écrit mon propre algorithme qui trie les mots. L'idée de base est un comparateur qui montre les mots de haut en bas et de gauche à droite (en anglais, bien sûr). J'utilise le bord inférieur (c'est-à-dire minY) du mot à comparer car il devrait être à peu près le même pour les mots de tailles différentes alors que le bord supérieur (ie maxY) peut être plus élevé pour les mots plus gros.

Je prends également en compte une certaine marge d'erreur dans la comparaison de l'axe des Y car l'image peut être légèrement inclinée ou l'OCR décide de vouloir dessiner le cadre de délimitation légèrement décalé. c'est à dire. Les mots peuvent être plus hauts ou plus bas que les autres mots sur la même ligne.

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()); 
    } 
    } 
}