Die OpenCV-Python-Bibliothek hat es ermöglicht, den Prozess des Zusammenführens mehrerer Bilder zu einem einzigen Panoramabild zu automatisieren.
Panoramafotografie ist die Technik zur Erfassung eines breiteren Sichtfelds, das mit einem einzelnen Foto nicht erreicht werden kann. Diese Technik fügt mehrere Bilder zusammen, um ein einzelnes Bild zu erstellen, das die gesamte Szene auf immersive Weise erfasst.
Mit Hilfe von Python können Sie diesen Prozess automatisieren und ganz einfach schöne Panoramen erstellen.
Einrichten Ihrer Python-Umgebung
Um durchzukommen, sollten Sie a Grundverständnis von Python. Starten Sie eine beliebige Python-IDE und Erstellen Sie eine neue virtuelle Umgebung. Erstellen Sie eine neue Python-Datei. Führen Sie auf dem Terminal den folgenden Befehl aus, um OpenCV zu installieren.
pip installiere opencv-contrib-python
Sie werden die verwenden opencv-contrib-python Bibliothek, um Bilder zu laden und sie zu bearbeiten. Es hat die cv2.Stitcher Klasse, mit der Sie die Panoramen erstellen.
Der vollständige Quellcode und Beispielbilder, die in diesem Artikel verwendet werden, sind hier verfügbar GitHub-Repository.
Importieren der erforderlichen Bibliotheken
Importieren Sie die Lebenslauf2 Und os Module in Ihr Skript. Sie werden OS verwenden, um durch die Systempfade zu navigieren.
importieren Lebenslauf2
importieren os
Der OS-Modul ist ein eingebautes Modul von Python. Aus diesem Grund müssen Sie es nicht extern installieren.
Laden der Bilder
Erstellen Sie eine Funktion zum Laden der Bilder, die Sie zusammenfügen möchten. Erstellen Sie zunächst eine leere Liste, in der die ursprünglichen Bilder gespeichert werden. Durchlaufen Sie dann jede Datei im Ordnerpfad und prüfen Sie, ob es sich bei der Datei um ein Bild handelt. Wenn es sich um ein Bild handelt, laden Sie es und hängen Sie es an die Liste der Bilder an.
defBilder laden(Ordnerpfad):
# Laden Sie Bilder aus einem Ordner und ändern Sie deren Größe.
Bilder = []
für Dateinamen In os.listdir (Ordnerpfad):
# Prüfen Sie, ob es sich bei der Datei um eine Bilddatei handelt
Wenn Dateiname.endswith('.jpg') oder Dateiname.endswith('.png'):
# Laden Sie das Bild mit OpenCV und ändern Sie die Größe
image = cv2.imread (os.path.join (Ordnerpfad, Dateiname))
images.append (Bild)
zurückkehren Bilder
Sie können weitere Bilddateiformate hinzufügen, um Ihr Programm zu diversifizieren. Dieser Code wird nur gesucht .jpg Und .png Dateiformate.
Anpassen der Bildgröße für einen einheitlichen Stich und eine schnellere Verarbeitung
Erstellen Sie eine Funktion, die die Größe der Bilderliste ändert. Die Funktion durchläuft jedes Bild in der Liste und ändert die Größe. Hängen Sie schließlich die in der Größe geänderten Bilder an eine neue Liste an.
defresize_images(Bilder, Breite, Höhe):
resized_images = []
für Bild In Bilder:
resized_image = cv2.resize (Bild, (Breite, Höhe))
resized_images.append (resized_image)
zurückkehren Resized_images
Durch die Größenänderung wird sichergestellt, dass das Zusammenfügen der Bilder einheitlich ist. Es reduziert auch die Dateigröße für eine schnellere Verarbeitung.
Verwenden des Stitcher-Moduls von OpenCV zum Zusammenfügen der Bilder
Erstellen Sie eine Funktion zum Zusammenfügen der in der Größe geänderten Bilder. Diese Technik ist allgemein als Erstellen eines Panoramas bekannt. Die Funktion nimmt eine Liste von Bildern als Eingabe. Verwenden Sie die Hefter Modul, um sie zusammenzufügen. Schließlich gibt die Funktion ein zusammengefügtes Bild und einen Statuscode zurück.
defStich_Bilder(Bilder):
Stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (Bilder)
Wenn status == cv2.STITCHER_OK:
zurückkehren genähtes_Bild
anders:
zurückkehrenKeiner
Wenn das Zusammenfügen erfolgreich war (wie durch die angezeigt cv2.STITCHER_OK Statuscode), gibt die Funktion das zusammengefügte Bild zurück. Andernfalls wird es zurückkehren Keiner.
Zuschneiden des zusammengefügten Bildes
Erstellen Sie eine Funktion, die das zusammengefügte Bild aufnimmt und nach dem Zuschneiden zurückgibt. Konvertieren Sie zuerst das zusammengefügte Bild in Graustufen. Wenden Sie dann einen binären Schwellenwert an, um ein binäres Bild zu erstellen. Finden Sie schließlich die größte Kontur im Binärbild und berechnen Sie ihr Begrenzungsrechteck.
defBild zuschneiden(Bild):
grau = cv2.cvtColor (Bild, cv2.COLOR_BGR2GRAY)
schwelle = cv2.schwelle (grau, 0, 255, cv2.THRESH_BINARY)[1]
Konturen = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (Konturen[0])
cropped_image = Bild [y: y + h, x: x + w]
zurückkehren cropped_image
Das zusammengefügte Bild wird mithilfe des Begrenzungsrechtecks zugeschnitten.
Vorschau und Speichern des zusammengefügten Bildes mit OpenCV
Erstellen Sie eine Funktion, die das zusammengesetzte Bild in einem interaktiven Fenster anzeigt und auf der Festplatte speichert.
defpreview_and_save_image(Bild, Ordnerpfad, Ordnername):
# Zeigen Sie das zusammengefügte Bild an
cv2.namedWindow('Zusammengesetztes Bild', cv2.WINDOW_NORMAL)
cv2.imshow('Zusammengesetztes Bild', Bild)
cv2.waitKey(0)
# Speichern Sie das zusammengefügte Bild
output_filename = os.path.join (Ordnerpfad, Ordnername + '_panorama.jpg')
cv2.imwrite (Ausgabe_Dateiname, Bild)
drucken('Zusammengesetztes Bild gespeichert für Ordner:', Ordnernamen)
Das Panoramabild wird im selben Ordner gespeichert, der auch die Originalbilder enthält.
Steuerung des Ablaufs Ihres Programms
Erstellen Sie eine Funktion, die den Ablauf Ihres Programms steuert. Es lädt alle Bilder aus dem angegebenen Ordner. Ändern Sie die Größe und nähen Sie sie zusammen. Schneiden Sie das zusammengefügte Bild zu, zeigen Sie seine Vorschau an und speichern Sie es dann auf der Festplatte. Wenn der Ordner weniger als zwei Bilder enthält, druckt die Funktion eine Fehlermeldung und kehrt zurück, ohne eine Zusammenfügung oder Speicherung durchzuführen.
defStich_Ordner(Ordnerpfad, Breite=800, Höhe =800):
# Nähen Sie alle Bilder in einem Ordner und speichern Sie das Ergebnis.
# Laden Sie die Bilder aus dem Ordner
images = load_images (Ordner_Pfad)# Überprüfen Sie, ob sich mindestens zwei Bilder im Ordner befinden
Wenn len (Bilder) < 2:
drucken('Nicht genügend Bilder im Ordner:', Ordnerpfad)
zurückkehren# Ändern Sie die Größe der Bilder
resized_images = resize_images (Bilder, Breite, Höhe)# Nähen Sie die Bilder
stitched_image = stitch_images (angepasste_Bilder)
Wenn genähtes_Bild IstKeiner:
drucken('Stitching für Ordner fehlgeschlagen:', Ordnerpfad)
zurückkehren# Das zusammengefügte Bild zuschneiden
cropped_image = crop_image (genähtes_Bild)
# Sehen Sie sich das zusammengefügte Bild an und speichern Sie es
Ordnername = os.Pfad.Basisname (Ordnerpfad)
preview_and_save_image (zugeschnittenes_Bild, Ordnerpfad, Ordnername)
Übergeben Sie den Ordnerpfad mit den Bildern, die Sie zusammenfügen möchten.
stitch_folder('Beispielbilder')
Die Bilder, die Sie verwenden, sollten überlappende Merkmale enthalten. Diese Merkmale können alles sein, von markanten Orientierungspunkten bis hin zu Texturmustern im Bild. OpenCV verwendet sie als Bezugspunkt, um die Bilder auszurichten.
Ohne diese Funktionen wird es für OpenCV schwierig sein, die Bilder auszurichten und ein nahtloses Panorama zu erstellen.
Testen Ihres Programms
Sammeln Sie die Bilder, die Sie in ein Panoramabild umwandeln möchten. Stellen Sie sicher, dass sie überlappende Features haben.
Schauen Sie sich den Hügel in diesem ersten Bild an.
In diesem zweiten Bild ist der Hügel leicht sichtbar. Dadurch entsteht ein überlappendes Feature.
Speichern Sie die Bilder in einem Ordner. Übergeben Sie den Ordnerpfad an die Stich_Ordner Funktion zum Nähen. Und dann das Programm ausführen.
Das Programm fügte die Bilder zusammen und erstellte ein Panoramabild mit einer breiteren Ansicht der Szene. Beachten Sie, dass zum Erstellen des obigen Panoramabilds neun Bilder verwendet wurden, die im oben erwähnten GitHub-Repository vorhanden sind.
Manipulation von Bildern mit OpenCV
Das Erstellen von Panoramen demonstriert einige der vielen Bildbearbeitungstechniken, die OpenCV bietet. Es gibt weitere Techniken, die Sie verwenden können, um Bilder nach Ihren Wünschen zu manipulieren. Die Arbeit an weiteren Projekten zur Bildmanipulation wird Ihnen dabei helfen, Ihre Computer-Vision-Fähigkeiten im Allgemeinen zu verbessern.