La libreria OpenCV Python ha reso possibile automatizzare il processo di unione di più immagini in un'unica immagine panoramica.

La fotografia panoramica è la tecnica per catturare un campo visivo più ampio che una singola fotografia non può raggiungere. Questa tecnica unisce più immagini insieme per creare un'unica immagine che cattura l'intera scena in modo coinvolgente.

Con l'aiuto di Python, puoi automatizzare questo processo e creare facilmente splendidi panorami.

Configurazione del tuo ambiente Python

Per seguire, dovresti avere a conoscenza di base di Python. Avvia qualsiasi IDE Python e creare un nuovo ambiente virtuale. Crea un nuovo file Python. E sul terminale, esegui il seguente comando per installare OpenCV.


pip installa opencv-contrib-python

Userai il opencv-contrib-python library per caricare immagini e manipolarle. Ha il cv2.Stitcher class che utilizzerai per creare i panorami.

Il codice sorgente completo e le immagini di esempio utilizzate in questo articolo sono disponibili in questo Deposito GitHub.

instagram viewer

Importazione delle librerie richieste

Importa il cv2 E os moduli nel tuo script. Utilizzerai il sistema operativo per navigare attraverso i percorsi di sistema.

importare cv2
importare os

IL modulo del sistema operativo è un modulo integrato di Python. Questo è il motivo per cui non è necessario installarlo esternamente.

Caricamento delle immagini

Crea una funzione per caricare le immagini che vuoi unire. Innanzitutto, crea un elenco vuoto che memorizzerà le immagini iniziali. Quindi scorrere ogni file nel percorso della cartella controllando se il file è un'immagine. Se si tratta di un'immagine, caricala e aggiungila all'elenco delle immagini.


defcarica_immagini(percorso_cartella):
# Carica le immagini da una cartella e ridimensionale.
immagini = []
per nome del file In os.listdir (percorso_cartella):
# Controlla se il file è un file immagine
Se nomefile.endswith('.jpg') O nomefile.endswith('.png'):
# Carica l'immagine usando OpenCV e ridimensionala
image = cv2.imread (os.path.join (folder_path, filename))
immagini.append (immagine)
ritorno immagini

Puoi aggiungere più formati di file immagine per diversificare il tuo programma. Questo codice cercherà solo .jpg E .png formati di file.

Ridimensionamento delle immagini per un punto uniforme e un'elaborazione più rapida

Crea una funzione che ridimensionerà l'elenco delle immagini. La funzione scorrerà ogni immagine nell'elenco e la ridimensionerà. Infine, aggiungi le immagini ridimensionate a un nuovo elenco.


defridimensiona_immagini(immagini, larghezza, altezza):
immagini_ridimensionate = []
per Immagine In immagini:
resized_image = cv2.resize (immagine, (larghezza, altezza))
resized_images.append (resized_image)
ritorno immagini_ridimensionate

Il ridimensionamento assicura che la cucitura delle immagini sia uniforme. Riduce anche la dimensione del file per un'elaborazione più rapida.

Utilizzo del modulo Stitcher di OpenCV per unire le immagini

Crea una funzione per unire insieme le immagini ridimensionate. Questa tecnica è comunemente nota come creazione di un panorama. La funzione prenderà un elenco di immagini come input. Usa il Cucitrice modulo per unirli insieme. Infine, la funzione restituirà un'immagine unita e un codice di stato.


defstitch_images(immagini):
cucitrice = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (immagini)
Se stato == cv2.STITCHER_OK:
ritorno immagine_cucita
altro:
ritornoNessuno

Se la cucitura è andata a buon fine (come indicato dal file cv2.STITCHER_OK codice di stato), la funzione restituirà l'immagine unita. Altrimenti tornerà Nessuno.

Ritaglio dell'immagine cucita

Crea una funzione che prenderà l'immagine unita e la restituirà dopo averla ritagliata. Innanzitutto, converti l'immagine cucita in scala di grigi. Quindi applica una soglia binaria per creare un'immagine binaria. Infine, trova il contorno più grande nell'immagine binaria e calcola il suo rettangolo di delimitazione.


defritaglia l'immagine(Immagine):
grigio = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)
soglia = cv2.soglia (grigio, 0, 255, cv2.THRESH_BINARY)[1]
contorni = cv2.findContours (soglia, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contours[0])
immagine_ritagliata = immagine[y: y + h, x: x + w]
ritorno immagine_ritagliata

L'immagine unita viene ritagliata utilizzando il rettangolo di delimitazione.

Anteprima e salvataggio dell'immagine cucita utilizzando OpenCV

Crea una funzione che visualizzerà l'immagine cucita in una finestra interattiva e la salverà sul disco.


defpreview_and_save_image(immagine, percorso_cartella, nome_cartella):
# Visualizza l'immagine unita
cv2.namedWindow('Immagine cucita', cv2.WINDOW_NORMAL)
cv2.imshow('Immagine cucita', Immagine)
cv2.waitKey(0)

# Salva l'immagine cucita
output_filename = os.path.join (folder_path, folder_name + '_panorama.jpg')
cv2.imwrite (output_filename, immagine)
stampa('Immagine cucita salvata per cartella:', nome della cartella)

L'immagine panoramica viene salvata nella stessa cartella che contiene le immagini originali.

Controllo del flusso del tuo programma

Crea una funzione che controllerà il flusso del tuo programma. Caricherà tutte le immagini dalla cartella specificata. Ridimensiona e uniscili insieme. Ritaglia l'immagine unita, visualizzane l'anteprima, quindi salvala su disco. Se ci sono meno di due immagini nella cartella, la funzione stamperà un messaggio di errore e ritornerà senza eseguire alcuna cucitura o salvataggio.


defcartella_punti(percorso_cartella, larghezza=800, altezza=800):
# Cuci tutte le immagini in una cartella e salva il risultato.
# Carica le immagini dalla cartella
immagini = carica_immagini (percorso_cartella)

# Controlla se ci sono almeno due immagini nella cartella
Se len (immagini) < 2:
stampa("Immagini insufficienti nella cartella:", percorso_cartella)
ritorno

# Ridimensiona le immagini
resized_images = resize_images (immagini, larghezza, altezza)

# Cuci le immagini
stitched_image = stitch_images (resized_images)
Se immagine_cucita ÈNessuno:
stampa('Unione fallita per la cartella:', percorso_cartella)
ritorno

# Ritaglia l'immagine cucita
immagine_ritagliata = immagine_ritagliata (immagine_cucita)

# Visualizza in anteprima e salva l'immagine cucita
nome_cartella = os.percorso.nomebase (percorso_cartella)
preview_and_save_image (immagine_ritagliata, percorso_cartella, nome_cartella)

Passa il percorso della cartella contenente le immagini che desideri cucire.

stitch_folder('campione_immagini') 

Le immagini che utilizzi devono contenere caratteristiche sovrapposte. Queste caratteristiche possono essere qualsiasi cosa, da punti di riferimento importanti a motivi di texture nell'immagine. OpenCV li utilizza come punto di riferimento per allineare le immagini.

Senza queste funzionalità, sarà difficile per OpenCV allineare le immagini e creare un panorama senza interruzioni.

Testare il tuo programma

Raccogli le immagini che desideri trasformare in un'immagine panoramica. Assicurati che abbiano caratteristiche sovrapposte.

Dai un'occhiata alla collina in questa prima immagine.

In questa seconda immagine la collina è leggermente visibile. Questo crea una caratteristica sovrapposta.

Salva le immagini in una cartella. Passare il percorso della cartella al file cartella_punti funzione per la cucitura. E quindi eseguire il programma.

Il programma ha unito le immagini e ha creato un'immagine panoramica con una visione più ampia della scena. Si noti che per creare l'immagine panoramica di cui sopra, sono state utilizzate nove immagini presenti nel suddetto repository GitHub.

Manipolazione di immagini utilizzando OpenCV

La creazione di panorami dimostra alcune delle molte tecniche di manipolazione delle immagini offerte da OpenCV. Esistono più tecniche che puoi utilizzare per manipolare le immagini in base alle tue esigenze. Lavorare su più progetti che coinvolgono la manipolazione delle immagini ti aiuterà a migliorare le tue capacità di visione artificiale in generale.