5
votes

Extraire le tableau ligné du document numérisé opencv python

Je veux extraire les informations d'une table scannée et la stocker dans un csv. À l'heure actuelle, mon algorithme d'extraction de table effectue les étapes suivantes.

  1. Appliquer la correction de biais
  2. Appliquez un filtre gaussien pour le débruitage.
  3. Faites une binarisation à l'aide du seuillage Otsu
  4. Faites une ouverture morphologique.
  5. Détection de Canny egde
  6. Effectuez une transformation intensive pour obtenir des lignes de tableau.
  7. Supprimer les lignes en double (les mêmes lignes dans la plage de 10 pixels)
  8. filtrez les lignes horizontales et verticales en utilisant la pente de la ligne (la pente doit être inférieure à +/- 5 degrés pour l'horizontale et la normale des verticales).

Cet algorithme fonctionne très bien pour les fichiers PDF numériques et la plupart des documents numérisés. Mais, certains des documents ont une table bruyante et donc il n'identifie pas correctement les lignes.

Voici un exemple d'image dans laquelle mon algorithme échoue.

 image brute

Voici les opérations que je fais sur cette table. 1. flou gaussien

 Flou gaussien

2.Seuil d'Otsu

 Seuil Otsu

3. ouverture morphologique

 Ouverture morphologique

4.Détection des bords de la cage

 Canny edge detection

5. lignes filtrées, comme vous pouvez le voir, les lignes ne sont clairement pas identifiées correctement.

 lignes filtrées, comme vous pouvez le voir, les lignes ne sont clairement pas identifiées correctement.

Quelqu'un peut-il suggérer une meilleure méthode pour extraire les lignes horizontales et verticales de ce type de numérisation de moins bonne qualité.

Merci d'avance !!


0 commentaires

3 Réponses :


0
votes

Le problème vient peut-être de HoughLinesTransform()

Vous pouvez essayer d'utiliser: HoughLinesTransformP()

Pour que HoughLinesTranform () fonctionne parfaitement, les lignes doivent être parfaites. À partir de l'image que vous avez fournie, vous pouvez voir clairement la distorsion qui provoque clairement l'échec de la méthode.

Essayez d'abord de dilater votre image. Dilatation d'image en Python.


0 commentaires

1
votes

Le problème est et sera toujours que vous n'avez pas de lignes parfaites. Une solution pour cette approche peut être:

  • Image de seuil en niveaux de gris comme vous l'avez fait.
  • Trouvez maintenant le plus grand contour de l'image, qui sera votre tableau.
  • Maintenant, utilisez Floodfill pour séparer le tableau de l'image, en choisissant n'importe quel point sur le contour pour créer un masque inondé,

0 commentaires

2
votes

J'ai trouvé une solution parfaite dans ce blog. https://medium.com/ coinmonks / a-box-detection-algorithm-for-any-image-contenant-boxes-756c15d7ed26

Ici, nous faisons des transformations morphologiques en utilisant un noyau vertical pour détecter les lignes vétiques et un noyau horizontal pour détecter les lignes horizontales, puis en les combinant pour obtenir toutes les lignes requises.

Lignes verticales Lignes verticales

Lignes horizontales Lignes horizontales

sortie requise sortie requise


0 commentaires