Skip to content

Instantly share code, notes, and snippets.

@billmetangmo
Created July 31, 2023 15:11
Show Gist options
  • Save billmetangmo/cc8983c40aca7dedfa4520f92c30f307 to your computer and use it in GitHub Desktop.
Save billmetangmo/cc8983c40aca7dedfa4520f92c30f307 to your computer and use it in GitHub Desktop.
ocr_pdf_scanneds

Comment détecter les tableaux sur les pages de pdf scannés ?

Détecter les tableaux dans des pages de PDF scannés est un problème qui implique plusieurs étapes, car vous travaillez avec des images numérisées plutôt qu'avec du texte numérique. Voici une approche générale:

  1. OCR (Reconnaissance optique de caractères) : La première étape consiste à utiliser une technologie OCR pour transformer les images numérisées en texte lisible par une machine. Il existe plusieurs outils qui peuvent faire cela, y compris Google's Vision API, Tesseract, Adobe's Acrobat, et d'autres. Notez que la qualité de la numérisation et la netteté de l'image peuvent affecter la précision de l'OCR.

  2. Détection des tableaux : Une fois que vous avez du texte lisible par une machine, vous pouvez commencer à détecter les tableaux. Il s'agit souvent d'une tâche difficile, car les tableaux peuvent avoir des formats très différents. Vous pourriez envisager d'utiliser des expressions régulières pour détecter des motifs qui ressemblent à des tableaux, ou utiliser des techniques de machine learning pour entraîner un modèle à détecter les tableaux. Il existe également des bibliothèques comme Tabula, Camelot ou PyPDF2 qui peuvent aider à détecter et extraire des tableaux.

  3. Extraction des données : Une fois que vous avez détecté un tableau, vous devez extraire les données. Cela peut impliquer de traiter le texte pour le nettoyer et le structurer correctement. Par exemple, vous pourriez devoir supprimer les espaces supplémentaires, convertir les nombres dans le bon format, etc.

  4. Vérification et correction : Enfin, vous devriez vérifier les données extraites pour vous assurer qu'elles sont correctes. Cela pourrait impliquer de vérifier les données avec une autre source, ou d'utiliser un logiciel de contrôle de qualité des données pour détecter les erreurs.

Il est important de noter que cette tâche peut être très complexe et nécessite souvent une approche sur mesure, en fonction de la qualité et de la structure des PDF scannés. Il est aussi à noter que la performance de ces techniques peut varier, et parfois une intervention manuelle peut être nécessaire pour corriger les erreurs ou affiner les résultats.

sans OCR

La détection de tableaux dans des documents PDF scannés sans utiliser de reconnaissance optique de caractères (OCR) peut être une tâche très difficile, car cela implique de travailler directement avec les données d'image plutôt qu'avec du texte.

Cependant, il existe des techniques basées sur l'analyse d'image qui pourraient aider à détecter les tableaux. Voici une approche générale que vous pouvez envisager :

  1. Prétraitement de l'image : Il peut être nécessaire de prétraiter l'image pour améliorer la qualité et la lisibilité. Cela peut impliquer des techniques comme le redimensionnement de l'image, la conversion en niveaux de gris, l'application de filtres pour réduire le bruit, etc.

  2. Détection des lignes et des contours : Vous pouvez utiliser des techniques de détection de contours pour identifier les lignes verticales et horizontales dans l'image. Ces lignes peuvent ensuite être utilisées pour détecter les tableaux. Par exemple, OpenCV est une bibliothèque populaire qui offre des fonctionnalités pour la détection de contours.

  3. Détection des cellules de tableau : Une fois que vous avez détecté les lignes, vous pouvez les utiliser pour identifier les cellules du tableau. Cela pourrait impliquer de rechercher des intersections de lignes, ou d'utiliser des techniques de morphologie mathématique pour regrouper les lignes en cellules.

  4. Extraction des données de tableau : Après avoir détecté les cellules du tableau, vous pouvez extraire les données de l'image à l'intérieur de chaque cellule. Cela pourrait impliquer l'utilisation de techniques de vision par ordinateur pour reconnaître les caractères ou les chiffres dans chaque cellule, mais sans utiliser l'OCR, ce serait un défi majeur.

Notez que cette approche suppose que les tableaux dans vos documents sont présentés sous une forme standard, avec des lignes claires définissant les cellules du tableau. Si les tableaux sont présentés sous une forme différente (par exemple, sans lignes définissant les cellules), cette approche pourrait ne pas fonctionner. En outre, cette approche ne fonctionnera probablement pas bien si les documents sont de mauvaise qualité, si les tableaux sont orientés de manière inhabituelle, ou si les documents contiennent d'autres éléments graphiques qui pourraient être confondus avec des tableaux.

peux tu me donner un exemple de coe python pour la détection de tableaux par la détection de lignes et de contours sans OCR

Bien sûr, voici un exemple de base de la façon dont vous pouvez utiliser OpenCV pour détecter les tableaux dans une image. Ce code est très simplifié et pourrait nécessiter des ajustements en fonction de la qualité de l'image et de la structure des tableaux.

python

import cv2
import numpy as np

# Charger l'image
img = cv2.imread('table.png',0)

# Réduire le bruit et convertir l'image en noir et blanc
_, thresh = cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)

# Détecter les lignes horizontales
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(img, [c], -1, (255,255,255), 2)

# Détecter les lignes verticales
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,10))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(img, [c], -1, (255,255,255), 2)

# Afficher l'image
cv2.imshow('table detection', img)
cv2.waitKey()

Ce code va d'abord convertir l'image en noir et blanc, puis utiliser la morphologie pour détecter les lignes horizontales et verticales dans l'image. Il va ensuite dessiner ces lignes sur l'image pour visualiser où les tableaux ont été détectés.

C'est une méthode très simple qui pourrait ne pas fonctionner parfaitement sur toutes les images. Pour une détection plus précise des tableaux, vous pourriez avoir besoin d'appliquer des techniques de prétraitement d'image plus avancées, d'ajuster les tailles des noyaux pour la détection des lignes, et éventuellement d'appliquer des techniques de post-traitement pour supprimer les faux positifs et fusionner les lignes proches.

un code pour fusionner les lignes proches

Une approche pour fusionner des lignes proches pourrait impliquer de regrouper des lignes sur la base de leur proximité et de leur orientation. Par exemple, vous pourriez regrouper des lignes horizontales qui sont proches en termes de coordonnées y, et des lignes verticales qui sont proches en termes de coordonnées x. Vous pourriez ensuite fusionner chaque groupe de lignes en une seule ligne qui s'étend de la ligne la plus à gauche (ou la plus en haut) à la ligne la plus à droite (ou la plus en bas) dans le groupe.

Il est important de noter que la manière dont vous choisissez de regrouper et de fusionner les lignes pourrait dépendre de la structure spécifique de vos tableaux et de la qualité de vos images. Par conséquent, cette approche pourrait nécessiter des ajustements en fonction de votre situation spécifique.

Voici un exemple simple de la façon dont vous pouvez regrouper et fusionner des lignes :

python

def merge_lines(lines, delta):
    # Triez les lignes par position de départ
    lines.sort(key=lambda x: x[0][0])

    merged_lines = []
    current_group = [lines[0]]

    for line in lines[1:]:
        # Si cette ligne est proche de la précédente, ajoutez-la au groupe
        if abs(line[0][0] - current_group[-1][1][0]) <= delta:
            current_group.append(line)
        else:
            # Sinon, fusionnez le groupe actuel et commencez un nouveau groupe
            merged_lines.append((current_group[0][0], current_group[-1][1]))
            current_group = [line]

    # Fusionnez le dernier groupe
    merged_lines.append((current_group[0][0], current_group[-1][1]))

    return merged_lines

Dans ce code, lines est une liste de tuples, où chaque tuple représente une ligne et contient deux tuples représentant les coordonnées de départ et de fin de la ligne. Par exemple, lines pourrait ressembler à ceci :

python

lines = [((10, 20), (30, 20)), ((35, 20), (55, 20)), ((60, 30), (80, 30)), ((85, 30), (105, 30))]

delta est la distance maximale entre deux lignes pour qu'elles soient considérées comme proches.

Ce code regroupe les lignes qui sont proches les unes des autres, puis fusionne chaque groupe en une seule ligne. Le résultat est une nouvelle liste de lignes, où chaque ligne est représentée par un tuple de coordonnées de début et de fin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment