La bibliothèque OpenCV Python a permis d'automatiser le processus de fusion de plusieurs images en une seule image panoramique.

La photographie panoramique est la technique de capture d'un champ de vision plus large qu'une seule photographie ne peut pas atteindre. Cette technique assemble plusieurs images pour créer une seule image qui capture toute la scène de manière immersive.

Avec l'aide de Python, vous pouvez automatiser ce processus et créer facilement de magnifiques panoramas.

Configuration de votre environnement Python

Pour suivre, vous devriez avoir un compréhension de base de Python. Lancez n'importe quel IDE Python et créer un nouvel environnement virtuel. Créez un nouveau fichier Python. Et sur le terminal, exécutez la commande suivante pour installer OpenCV.


pip installer opencv-contrib-python

Vous utiliserez le opencv-contrib-python bibliothèque pour charger des images et les manipuler. Il a la cv2.Stitcher classe que vous utiliserez pour créer les panoramas.

Le code source complet et les exemples d'images utilisés dans cet article sont disponibles dans ce

instagram viewer
Référentiel GitHub.

Importation des bibliothèques requises

Importez le cv2 et os modules dans votre script. Vous utiliserez le système d'exploitation pour naviguer dans les chemins du système.

importer cv2
importer os

Le module de système d'exploitation est un module intégré de Python. C'est la raison pour laquelle vous n'avez pas besoin de l'installer en externe.

Chargement des images

Créez une fonction pour charger les images que vous souhaitez assembler. Tout d'abord, créez une liste vide qui stockera les images initiales. Parcourez ensuite chaque fichier dans le chemin du dossier en vérifiant si le fichier est une image. S'il s'agit d'une image, chargez-la et ajoutez-la à la liste des images.


définitivementChargement des images(chemin_dossier):
# Chargez les images d'un dossier et redimensionnez-les.
images = []
pour nom de fichier dans os.listdir (chemin_dossier) :
# Vérifiez si le fichier est un fichier image
si nomfichier.endswith('.jpg') ou nomfichier.endswith('.png'):
# Chargez l'image à l'aide d'OpenCV et redimensionnez-la
image = cv2.imread (os.path.join (chemin_dossier, nom_fichier))
images.append (image)
retour images

Vous pouvez ajouter plus de formats de fichiers image pour diversifier votre programme. Ce code ne cherchera que .jpg et .png formats de fichiers.

Redimensionnement des images pour un point uniforme et un traitement plus rapide

Créez une fonction qui redimensionnera la liste des images. La fonction parcourra chaque image de la liste et la redimensionnera. Enfin, ajoutez les images redimensionnées à une nouvelle liste.


définitivementredimensionner_images(images, largeur, hauteur):
images_redimensionnées = []
pour image dans images:
resized_image = cv2.resize (image, (largeur, hauteur))
images_redimensionnées.append (image_redimensionnée)
retour images_redimensionnées

Le redimensionnement garantit que l'assemblage des images est uniforme. Il réduit également la taille du fichier pour un traitement plus rapide.

Utilisation du module Stitcher d'OpenCV pour assembler les images

Créez une fonction pour assembler les images redimensionnées. Cette technique est communément appelée création d'un panorama. La fonction prendra une liste d'images en entrée. Utilisez le Brodeuse module pour les assembler. Enfin, la fonction renverra une image assemblée et un code d'état.


définitivementpoints_images(images):
stitcher = cv2.Stitcher.create()
(statut, stitched_image) = stitcher.stitch (images)
si statut == cv2.STITCHER_OK :
retour image_cousue
autre:
retourAucun

Si l'assemblage a réussi (comme indiqué par le cv2.STITCHER_OK code d'état), la fonction renverra l'image assemblée. Sinon, il reviendra Aucun.

Recadrage de l'image assemblée

Créez une fonction qui prendra l'image assemblée et la renverra après l'avoir recadrée. Tout d'abord, convertissez l'image assemblée en niveaux de gris. Appliquez ensuite un seuil binaire pour créer une image binaire. Enfin, trouvez le plus grand contour de l'image binaire et calculez son rectangle englobant.


définitivementcrop_image(image):
gris = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
seuil = cv2.seuil (gris, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (seuil, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contours[0])
cropped_image = image[y: y + h, x: x + w]
retour cropped_image

L'image assemblée est recadrée à l'aide du rectangle de délimitation.

Prévisualisation et enregistrement de l'image cousue à l'aide d'OpenCV

Créez une fonction qui affichera l'image assemblée dans une fenêtre interactive et l'enregistrera sur le disque.


définitivementpreview_and_save_image(image, chemin_dossier, nom_dossier):
# Afficher l'image cousue
cv2.namedWindow('Image cousue', cv2.WINDOW_NORMAL)
cv2.imshow('Image cousue', image)
cv2.waitKey(0)

# Enregistrer l'image cousue
nom_fichier_sortie = os.path.join (chemin_dossier, nom_dossier + '_panorama.jpg')
cv2.imwrite (nom_fichier_sortie, image)
imprimer('Image assemblée enregistrée pour le dossier :', nom de dossier)

L'image panoramique est enregistrée dans le même dossier qui contient les images d'origine.

Contrôler le déroulement de votre programme

Créez une fonction qui contrôlera le déroulement de votre programme. Il chargera toutes les images du dossier spécifié. Redimensionnez-les et cousez-les ensemble. Recadrez l'image assemblée, affichez son aperçu, puis enregistrez-la sur le disque. S'il y a moins de deux images dans le dossier, la fonction imprimera un message d'erreur et reviendra sans effectuer d'assemblage ni d'enregistrement.


définitivementdossier_point(chemin_dossier, largeur=800, hauteur=800):
# Assemblez toutes les images dans un dossier et enregistrez le résultat.
# Charger les images du dossier
images = load_images (chemin_dossier)

# Vérifiez s'il y a au moins deux images dans le dossier
si len (images) < 2:
imprimer('Pas assez d'images dans le dossier :', chemin_dossier)
retour

# Redimensionner les images
resized_images = resize_images (images, largeur, hauteur)

# Assemblez les images
stitched_image = stitch_images (resized_images)
si image_cousue estAucun:
imprimer('Échec de l'assemblage pour le dossier :', chemin_dossier)
retour

# Recadrer l'image cousue
cropped_image = crop_image (image_cousue)

# Prévisualisez et enregistrez l'image cousue
nom_dossier = os.path.basename (chemin_dossier)
preview_and_save_image (image_recadrée, chemin_dossier, nom_dossier)

Passez le chemin du dossier contenant les images que vous souhaitez assembler.

stitch_folder('sample_images') 

Les images que vous utilisez doivent contenir des fonctionnalités qui se chevauchent. Ces caractéristiques peuvent être n'importe quoi, des points de repère importants aux motifs de texture dans l'image. OpenCV les utilise comme point de référence pour aligner les images.

Sans ces fonctionnalités, il sera difficile pour OpenCV d'aligner les images et de créer un panorama homogène.

Tester votre programme

Rassemblez les images que vous souhaitez transformer en image panoramique. Assurez-vous qu'ils ont des fonctionnalités qui se chevauchent.

Jetez un oeil à la colline dans cette première image.

Sur cette deuxième image, la colline est légèrement visible. Cela crée une fonction de chevauchement.

Enregistrez les images dans un dossier. Transmettez le chemin du dossier au dossier_point fonction de couture. Et puis lancez le programme.

Le programme a assemblé les images et créé une image panoramique avec une vue plus large de la scène. Notez que pour créer l'image panoramique ci-dessus, neuf images ont été utilisées qui sont présentes dans le référentiel GitHub mentionné ci-dessus.

Manipulation d'images à l'aide d'OpenCV

La création de panoramas illustre certaines des nombreuses techniques de manipulation d'images proposées par OpenCV. Il existe d'autres techniques que vous pouvez utiliser pour manipuler les images en fonction de vos besoins. Travailler sur plus de projets impliquant la manipulation d'images vous aidera à améliorer vos compétences en vision par ordinateur en général.