OpenCV Python-biblioteket har gjort det mulig å automatisere prosessen med å slå sammen flere bilder til ett enkelt panoramabilde.
Panoramafotografering er teknikken for å fange et bredere synsfelt som et enkelt fotografi ikke kan oppnå. Denne teknikken syr sammen flere bilder for å lage et enkelt bilde som fanger hele scenen på en oppslukende måte.
Ved hjelp av Python kan du automatisere denne prosessen og enkelt lage vakre panoramaer.
Sette opp Python-miljøet ditt
For å følge opp, bør du ha en grunnleggende forståelse av Python. Start en hvilken som helst Python IDE og lage et nytt virtuelt miljø. Opprett en ny Python-fil. Og på terminalen, kjør følgende kommando for å installere OpenCV.
pip installer opencv-contrib-python
Du vil bruke opencv-contrib-python bibliotek for å laste inn bilder og manipulere dem. Den har cv2.Stitcher klasse som du skal bruke til å lage panoramaene.
Den fullstendige kildekoden og eksempelbildene som brukes i denne artikkelen er tilgjengelige i denne GitHub-depot.
Importere de nødvendige bibliotekene
Importer cv2 og os moduler inn i skriptet ditt. Du vil bruke OS til å navigere gjennom systembanene.
import cv2
import os
De OS-modul er en innebygd modul i Python. Dette er grunnen til at du ikke trenger å installere den eksternt.
Laster inn bildene
Lag en funksjon for å laste inn bildene du vil sy. Lag først en tom liste som vil lagre de første bildene. Gå deretter gjennom hver fil i mappebanen for å sjekke om filen er et bilde. Hvis det er et bilde, last og legg det til i listen over bilder.
deflast_bilder(mappebane):
# Last inn bilder fra en mappe og endre størrelsen på dem.
bilder = []
til filnavn i os.listdir (mappebane):
# Sjekk om filen er en bildefil
hvis filnavn.endswith('.jpg') eller filnavn.endswith('.png'):
# Last inn bildet ved hjelp av OpenCV og endre størrelsen på det
image = cv2.imread (os.path.join (mappebane, filnavn))
images.append (bilde)
komme tilbake Bilder
Du kan legge til flere bildefilformater for å diversifisere programmet. Denne koden vil bare se etter .jpg og .png filformater.
Endre størrelsen på bildene for en jevn søm og raskere behandling
Lag en funksjon som vil endre størrelsen på listen over bilder. Funksjonen vil gå gjennom hvert bilde i listen og endre størrelsen på det. Til slutt legger du til de endrede størrelsene på en ny liste.
defendre størrelse_bilder(bilder, bredde, høyde):
resized_images = []
til bilde i Bilder:
resized_image = cv2.resize (bilde, (bredde, høyde))
resized_images.append (resized_image)
komme tilbake endre størrelse_bilder
Endre størrelse sørger for at sammensetningen av bildene er jevn. Det reduserer også filstørrelsen for raskere behandling.
Bruke OpenCVs Stitcher-modul til å sy bildene
Lag en funksjon for å sy sammen bildene med endret størrelse. Denne teknikken er vanligvis kjent som å lage et panorama. Funksjonen vil ta en liste over bilder som input. Bruke Stitcher modul for å sy dem sammen. Til slutt vil funksjonen returnere et sammensatt bilde og en statuskode.
defstitch_images(Bilder):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (images)
hvis status == cv2.STITCHER_OK:
komme tilbake stitched_image
ellers:
komme tilbakeIngen
Hvis sømmen var vellykket (som indikert av cv2.STITCHER_OK statuskode), vil funksjonen returnere det sammensatte bildet. Ellers kommer den tilbake Ingen.
Beskjæring av det sammensydde bildet
Lag en funksjon som tar inn det sammensatte bildet og returnerer det etter beskjæring. Konverter først det sammensatte bildet til gråtoner. Bruk deretter en binær terskel for å lage et binært bilde. Til slutt finner du den største konturen i det binære bildet og beregner det avgrensende rektangelet.
defbeskjære_bilde(bilde):
grå = cv2.cvtColor (bilde, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (grå, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (konturer[0])
cropped_image = bilde[y: y + h, x: x + w]
komme tilbake cropped_image
Det sammensatte bildet beskjæres ved hjelp av det avgrensende rektangelet.
Forhåndsvisning og lagring av det sammensatte bildet ved hjelp av OpenCV
Lag en funksjon som viser det sammensatte bildet i et interaktivt vindu og lagrer det på disken.
defforhåndsvisning_og_lagre_bilde(bilde, mappebane, mappenavn):
# Vis det sammensatte bildet
cv2.namedWindow("Sømt bilde", cv2.WINDOW_NORMAL)
cv2.imshow("Sømt bilde", bilde)
cv2.waitKey(0)
# Lagre det sammensydde bildet
output_filename = os.path.join (mappebane, mappenavn + '_panorama.jpg')
cv2.imwrite (utdatafilnavn, bilde)
skrive ut('Sett sammen bilde lagret for mappe:', mappenavn)
Panoramabildet lagres i samme mappe som inneholder originalbildene.
Kontroller flyten av programmet ditt
Lag en funksjon som vil kontrollere flyten av programmet ditt. Det vil laste inn alle bildene fra den angitte mappen. Endre størrelsen og sy dem sammen. Beskjær det sammensatte bildet, vis forhåndsvisningen og lagre det på disk. Hvis det er færre enn to bilder i mappen, vil funksjonen skrive ut en feilmelding og returnere uten å sy eller lagre.
defstitch_folder(mappebane, bredde=800, høyde=800):
# Sett sammen alle bildene i en mappe og lagre resultatet.
# Last inn bildene fra mappen
bilder = last_bilder (mappebane)# Sjekk om det er minst to bilder i mappen
hvis len (bilder) < 2:
skrive ut('Ikke nok bilder i mappen:', mappe_bane)
komme tilbake# Endre størrelsen på bildene
resized_images = resize_images (bilder, bredde, høyde)# Sy sammen bildene
stitched_image = stitch_images (endre størrelse_bilder)
hvis stitched_image erIngen:
skrive ut('Søming mislyktes for mappe:', mappe_bane)
komme tilbake# Beskjær det sammensatte bildet
cropped_image = crop_image (stitched_image)
# Forhåndsvis og lagre det sammensydde bildet
mappenavn = os.bane.basenavn (mappebane)
forhåndsvisning_og_lagre_bilde (beskåret_bilde, mappebane, mappenavn)
Pass på mappebanen som inneholder bildene du vil sette sammen.
stitch_folder('sample_images')
Bildene du bruker bør inneholde overlappende funksjoner. Disse funksjonene kan være alt fra fremtredende landemerker til teksturmønstre i bildet. OpenCV bruker dem som et referansepunkt for å justere bildene.
Uten disse funksjonene vil det være vanskelig for OpenCV å justere bildene og lage et sømløst panorama.
Tester programmet ditt
Samle bildene du vil forvandle til et panoramabilde. Sørg for at de har overlappende funksjoner.
Ta en titt på bakken i dette første bildet.
På dette andre bildet er bakken litt synlig. Dette skaper en overlappende funksjon.
Lagre bildene i en mappe. Send mappebanen til stitch_folder funksjon for søm. Og kjør deretter programmet.
Programmet sydde bildene sammen og skapte et panoramabilde med en bredere visning av scenen. Merk at for å lage panoramabildet ovenfor, ble ni bilder brukt som er til stede i det ovennevnte GitHub-depotet.
Manipulering av bilder ved hjelp av OpenCV
Å lage panoramaer demonstrerer noen av de mange bildemanipuleringsteknikkene som OpenCV tilbyr. Det er flere teknikker du kan bruke for å manipulere bilder for å passe ditt behov. Å jobbe med flere prosjekter som involverer bildemanipulering vil hjelpe deg med å forbedre datasynsferdighetene dine generelt.