Forum général.cherche-logiciel Détourage scan depuis photo téléphone

Posté par . Licence CC By‐SA.
Étiquettes : aucune
4
25
avr.
2024

Bonjour,

Je cherche à détourer des scans de document pris depuis un appareil photo de téléphone.
Certaines application sur téléphone le font automatiquement lors de la prise de photo (notes sur iphone, CamScanner ou google drive sur android)

La photo étant récupéré directement depuis un champ "fichier" d'un formulaire, je n'ai pas cette possibilité (j'ai pas trouvé en tout cas).

Je cherche donc à faire le traitement coté serveur.

J'ai essayé rembg en python : cela fonctionne correctement mais c'est très long et l'image généré est beaucoup plus grosse que l'originale.

ImageMagick a l'air d'avoir une option trim pour faire cela mais je n'arrive pas à avoir les bons paramètres. Le fond en dehors de la feuille scannée est de couleur aléatoire (bois de la table où est posé la document, nappe ...)

Est ce que vous auriez une solution ?

  • # ChatGPT

    Posté par . Évalué à 3.

    Je me réponds à moi même !

    ChatGPT a une solution en python avec opencv, c'est super rapide. Par contre il me met un fond noir autour de la page détecté. Impossible de lui faire recadrer l'image sur la détection ou même remplacer le noir par du blanc.

     import sys
     import cv2
     import numpy as np
     import os
     def detect_document(image_path):
     # Charger l'image
     image = cv2.imread(image_path)
     # Convertir l'image en niveaux de gris
     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
     # Appliquer un flou gaussien pour réduire le bruit
     blurred = cv2.GaussianBlur(gray, (5, 5), 0)
     # Détecter les contours avec l'algorithme de Canny
     edges = cv2.Canny(blurred, 50, 150)
     # Trouver les contours dans l'image
     contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
     # Trier les contours par aire décroissante
     contours = sorted(contours, key=cv2.contourArea, reverse=True)
     # Parcourir les contours pour trouver celui qui correspond probablement à la feuille
     for contour in contours:
     # Approximer le contour à un polygone
     peri = cv2.arcLength(contour, True)
     approx = cv2.approxPolyDP(contour, 0.02 * peri, True)
     # Si le polygone a quatre côtés, c'est probablement la feuille
     if len(approx) == 4:
     page_contour = approx
     break
     # Dessiner le contour de la feuille sur une nouvelle image
     contour_image = np.zeros_like(image)
     cv2.drawContours(contour_image, [page_contour], -1, (255, 255, 255), thickness=cv2.FILLED)
     # Appliquer le masque à l'image d'origine pour extraire la région d'intérêt
     masked_image = cv2.bitwise_and(image, contour_image)
     # Trouver les coordonnées de la boîte englobante pour la région d'intérêt
     x, y, w, h = cv2.boundingRect(page_contour)
     # Recadrer l'image en fonction de la région d'intérêt
     cropped_image = masked_image[y:y+h, x:x+w]
     # Obtenir le chemin complet de l'image recadrée avec le préfixe "crop_"
     output_dir, filename = os.path.split(image_path)
     filename, file_extension = os.path.splitext(filename)
     output_path = os.path.join(output_dir, 'crop_' + filename + file_extension)
     # Enregistrer l'image recadrée avec le contour détecté
     cv2.imwrite(output_path, cropped_image)
     print("Image recadrée avec succès. Chemin d'enregistrement:", output_path)
     if __name__ == "__main__":
     # Vérifier si un argument a été fourni
     if len(sys.argv) != 2:
     print("Usage: python script.py <image_path>")
     sys.exit(1)
     # Récupérer le chemin de l'image à partir des arguments de la ligne de commande
     image_path = sys.argv[1]
     # Appeler la fonction pour détecter le document
     detect_document(image_path)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.