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.