Biblioteca OpenCV Python a făcut posibilă automatizarea procesului de îmbinare a mai multor imagini într-o singură imagine panoramică.
Fotografia panoramică este tehnica de a capta un câmp vizual mai larg pe care o singură fotografie nu îl poate realiza. Această tehnică unește mai multe imagini împreună pentru a crea o singură imagine care surprinde întreaga scenă într-un mod captivant.
Cu ajutorul lui Python, puteți automatiza acest proces și puteți crea panorame frumoase cu ușurință.
Configurarea mediului Python
Pentru a urma, ar trebui să aveți un înțelegerea de bază a Python. Lansați orice IDE Python și creați un nou mediu virtual. Creați un nou fișier Python. Și pe terminal, rulați următoarea comandă pentru a instala OpenCV.
pip install opencv-contrib-python
Veți folosi opencv-contrib-python bibliotecă pentru a încărca imagini și a le manipula. Are cv2.Cusător clasă pe care o veți folosi pentru a crea panoramele.
Codul sursă complet și imaginile eșantion utilizate în acest articol sunt disponibile în acesta Depozitul GitHub.
Importarea bibliotecilor necesare
Importă cv2 și os module în scriptul dvs. Veți folosi sistemul de operare pentru a naviga prin căile sistemului.
import cv2
import os
The modul OS este un modul încorporat de Python. Acesta este motivul pentru care nu trebuie să-l instalați extern.
Încărcarea imaginilor
Creați o funcție pentru încărcarea imaginilor pe care doriți să le cusați. Mai întâi, creați o listă goală care va stoca imaginile inițiale. Apoi parcurgeți fiecare fișier din calea folderului, verificând dacă fișierul este o imagine. Dacă este o imagine, încărcați-o și adăugați-o la lista de imagini.
defîncărcare_imagini(calea_dosar):
# Încărcați imagini dintr-un folder și redimensionați-le.
imagini = []
pentru nume de fișier în os.listdir (calea_dosarului):
# Verificați dacă fișierul este un fișier imagine
dacă filename.endswith(„.jpg”) sau filename.endswith(„.png”):
# Încărcați imaginea folosind OpenCV și redimensionați-o
imagine = cv2.imread (os.path.join (folder_path, filename))
images.append (imagine)
întoarcere imagini
Puteți adăuga mai multe formate de fișiere imagine pentru a vă diversifica programul. Acest cod va căuta doar .jpg și .png formate de fișiere.
Redimensionarea imaginilor pentru o cusătură uniformă și procesare mai rapidă
Creați o funcție care va redimensiona lista de imagini. Funcția va parcurge fiecare imagine din listă și o va redimensiona. În cele din urmă, adăugați imaginile redimensionate la o nouă listă.
defredimensionare_imagini(imagini, latime, inaltime):
imagini_redimensionate = []
pentru imagine în imagini:
resized_image = cv2.resize (imagine, (lățime, înălțime))
resized_images.append (imagine_redimensionată)
întoarcere imagini_redimensionate
Redimensionarea se asigură că cusătura imaginilor este uniformă. De asemenea, reduce dimensiunea fișierului pentru o procesare mai rapidă.
Folosind modulul Stitcher al OpenCV pentru a cusă imaginile
Creați o funcție pentru a îmbina imaginile redimensionate. Această tehnică este cunoscută în mod obișnuit ca crearea unei panorame. Funcția va prelua o listă de imagini ca intrare. Folosește Cusător modul pentru a le uni. În cele din urmă, funcția va returna o imagine cusată și un cod de stare.
defstitch_images(imagini):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (imagini)
dacă stare == cv2.STITCHER_OK:
întoarcere imagine_cusută
altfel:
întoarcereNici unul
Dacă cusătura a avut succes (după cum este indicat de cv2.STITCHER_OK cod de stare), funcția va returna imaginea cusată. În caz contrar, se va întoarce Nici unul.
Decuparea imaginii cusute
Creați o funcție care va prelua imaginea cusată și o va returna după ce o decupați. Mai întâi, convertiți imaginea cusată în tonuri de gri. Apoi aplicați un prag binar pentru a crea o imagine binară. În cele din urmă, găsiți cel mai mare contur din imaginea binară și calculați dreptunghiul său de delimitare.
defcrop_image(imagine):
gri = cv2.cvtColor (imagine, cv2.COLOR_BGR2GRAY)
prag = cv2.prag (gri, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contururi[0])
imagine_decupată = imagine[y: y + h, x: x + w]
întoarcere imagine_decupată
Imaginea cusută este tăiată folosind dreptunghiul de delimitare.
Previzualizarea și salvarea imaginii cusute folosind OpenCV
Creați o funcție care va afișa imaginea cusată într-o fereastră interactivă și o va salva pe disc.
defprevizualizare_și_salvare_imagine(imagine, folder_path, folder_name):
# Afișează imaginea cusată
cv2.namedWindow(„Imagine cusută”, cv2.WINDOW_NORMAL)
cv2.imshow(„Imagine cusută”, imagine)
cv2.waitKey(0)
# Salvați imaginea cusută
output_filename = os.path.join (calea_dosarului, numele_dosarului + „_panorama.jpg”)
cv2.imwrite (output_filename, imagine)
imprimare(„Imaginea cusută salvată pentru dosar:”, numele fisierului)
Imaginea panoramică este salvată în același folder care conține imaginile originale.
Controlul fluxului programului dvs
Creați o funcție care va controla fluxul programului dvs. Va încărca toate imaginile din folderul specificat. Redimensionați și coaseți-le împreună. Decupați imaginea cusată, afișați previzualizarea acesteia și apoi salvați-o pe disc. Dacă există mai puțin de două imagini în dosar, funcția va imprima un mesaj de eroare și va reveni fără a efectua nicio coasere sau salvare.
defstitch_folder(folder_path, width=800, inaltime=800):
# Uniți toate imaginile într-un folder și salvați rezultatul.
# Încărcați imaginile din folder
imagini = încărcare_imagini (folder_path)# Verificați dacă există cel puțin două imagini în dosar
dacă len (imagini) < 2:
imprimare(„Nu sunt suficiente imagini în dosar:”, folder_path)
întoarcere# Redimensionați imaginile
resized_images = resize_images (imagini, lățime, înălțime)# Coaseți imaginile
stitched_image = stitch_images (imagini_redimensionate)
dacă imagine_cusută esteNici unul:
imprimare(„Cosere eșuată pentru dosar:”, folder_path)
întoarcere# Decupați imaginea cusată
cropped_image = crop_image (imagine_cusătură)
# Previzualizează și salvează imaginea cusută
folder_name = os.path.basename (folder_path)
preview_and_save_image (imagine_decupată, calea_dosarului, numele_dosarului)
Treceți calea folderului care conține imaginile pe care doriți să le îmbinați.
stitch_folder('sample_images')
Imaginile pe care le utilizați ar trebui să conțină caracteristici care se suprapun. Aceste caracteristici pot fi orice, de la repere proeminente la modele de textură din imagine. OpenCV le folosește ca punct de referință pentru a alinia imaginile.
Fără aceste caracteristici, va fi dificil pentru OpenCV să alinieze imaginile și să creeze o panoramă perfectă.
Testarea programului dvs
Colectați imaginile pe care doriți să le transformați într-o imagine panoramică. Asigurați-vă că au caracteristici care se suprapun.
Aruncă o privire asupra dealului din această primă imagine.
În această a doua imagine, dealul este puțin vizibil. Acest lucru creează o caracteristică de suprapunere.
Salvați imaginile într-un folder. Treceți calea folderului către stitch_folder functie de cusatura. Și apoi rulați programul.
Programul a îmbinat imaginile și a creat o imagine panoramică cu o vedere mai largă a scenei. Rețineți că pentru a crea imaginea panoramică de mai sus, au fost folosite nouă imagini care sunt prezente în depozitul GitHub menționat mai sus.
Manipularea imaginilor folosind OpenCV
Crearea de panorame demonstrează unele dintre numeroasele tehnici de manipulare a imaginilor pe care OpenCV le oferă. Există mai multe tehnici pe care le puteți folosi pentru a manipula imaginile în funcție de nevoile dvs. Lucrul la mai multe proiecte care implică manipularea imaginii vă va ajuta să vă îmbunătățiți abilitățile de viziune pe computer în general.