OpenCV Python-biblioteket har gjort det möjligt att automatisera processen att slå samman flera bilder till en enda panoramabild.

Panoramafotografering är tekniken för att fånga ett bredare synfält som ett enda fotografi inte kan uppnå. Denna teknik syr ihop flera bilder för att skapa en enda bild som fångar hela scenen på ett uppslukande sätt.

Med hjälp av Python kan du automatisera denna process och skapa vackra panoramabilder med lätthet.

Konfigurera din Python-miljö

För att gå igenom bör du ha en grundläggande förståelse för Python. Starta valfri Python IDE och skapa en ny virtuell miljö. Skapa en ny Python-fil. Och på terminalen, kör följande kommando för att installera OpenCV.


pip installera opencv-contrib-python

Du kommer att använda opencv-contrib-python bibliotek för att ladda bilder och manipulera dem. Den har cv2.Stitcher klass som du kommer att använda för att skapa panoramabilderna.

Den fullständiga källkoden och exempelbilderna som används i den här artikeln finns tillgängliga i denna GitHub-förråd.

instagram viewer

Importera de obligatoriska biblioteken

Importera cv2 och os moduler i ditt manus. Du kommer att använda OS för att navigera genom systemvägarna.

importera cv2
importera os

De OS-modul är en inbyggd modul i Python. Detta är anledningen till att du inte behöver installera den externt.

Laddar bilderna

Skapa en funktion för att ladda de bilder du vill sy. Skapa först en tom lista som lagrar de ursprungliga bilderna. Gå sedan igenom varje fil i mappsökvägen och kontrollera om filen är en bild. Om det är en bild, ladda och lägg till den i listan över bilder.


defladda_bilder(sökväg):
# Ladda bilder från en mapp och ändra storlek på dem.
bilder = []
för filnamn i os.listdir (mappsökväg):
# Kontrollera om filen är en bildfil
om filnamn.slutar med('.jpg') eller filnamn.slutar med('.png'):
# Ladda bilden med OpenCV och ändra storlek på den
image = cv2.imread (os.path.join (mappsökväg, filnamn))
images.append (bild)
lämna tillbaka bilder

Du kan lägga till fler bildfilformat för att diversifiera ditt program. Denna kod kommer bara att leta efter .jpg och .png filformat.

Ändra storlek på bilderna för en enhetlig söm och snabbare bearbetning

Skapa en funktion som ändrar storlek på listan med bilder. Funktionen går igenom varje bild i listan och ändrar storleken på den. Lägg slutligen till de ändrade storleksbilderna till en ny lista.


defresize_images(bilder, bredd, höjd):
resized_images = []
för bild i bilder:
resized_image = cv2.resize (bild, (bredd, höjd))
resized_images.append (resized_image)
lämna tillbaka resized_images

Ändra storlek ser till att sammanfogningen av bilderna är enhetlig. Det minskar också filstorleken för snabbare bearbetning.

Använda OpenCV: s Stitcher-modul för att sy ihop bilderna

Skapa en funktion för att sammanfoga de ändrade storlekarna. Denna teknik är allmänt känd som att skapa ett panorama. Funktionen tar en lista med bilder som indata. Använd Stitcher modul för att sy ihop dem. Slutligen kommer funktionen att returnera en sammanfogad bild och en statuskod.


defstitch_images(bilder):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (images)
om status == cv2.STITCHER_OK:
lämna tillbaka stitched_image
annan:
lämna tillbakaIngen

Om sömmen lyckades (som indikeras av cv2.STITCHER_OK statuskod), returnerar funktionen den sammanfogade bilden. Annars kommer den tillbaka Ingen.

Beskär den sammanfogade bilden

Skapa en funktion som tar in den sammanfogade bilden och returnerar den efter att den har beskurits. Konvertera först den sammanfogade bilden till gråskala. Använd sedan en binär tröskel för att skapa en binär bild. Hitta slutligen den största konturen i den binära bilden och beräkna dess avgränsande rektangel.


defbeskära bild(bild):
grå = cv2.cvtColor (bild, cv2.COLOR_BGR2GRAY)
tröskel = 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 = bild[y: y + h, x: x + w]
lämna tillbaka cropped_image

Den sammanfogade bilden beskärs med hjälp av avgränsningsrektangeln.

Förhandsgranska och spara den sammanfogade bilden med OpenCV

Skapa en funktion som visar den sammanfogade bilden i ett interaktivt fönster och sparar den på disken.


defförhandsgranska_och_spara_bild(bild, mappsökväg, mappnamn):
# Visa den sammanfogade bilden
cv2.namedWindow("Sömnad bild", cv2.WINDOW_NORMAL)
cv2.imshow("Sömnad bild", bild)
cv2.waitKey(0)

# Spara den sammanfogade bilden
output_filename = os.path.join (mappsökväg, mappnamn + '_panorama.jpg')
cv2.imwrite (output_filename, image)
skriva ut("Sättad bild sparad för mapp:", mapp namn)

Panoramabilden sparas i samma mapp som innehåller originalbilderna.

Styr flödet av ditt program

Skapa en funktion som styr flödet av ditt program. Det kommer att ladda alla bilder från den angivna mappen. Ändra storlek och sy ihop dem. Beskär den sammanfogade bilden, visa dess förhandsgranskning och spara den sedan på disk. Om det finns färre än två bilder i mappen kommer funktionen att skriva ut ett felmeddelande och återkomma utan att sy eller spara.


defstitch_folder(folder_path, width=800, höjd=800):
# Sammanfoga alla bilder i en mapp och spara resultatet.
# Ladda bilderna från mappen
bilder = ladda_bilder (mappsökväg)

# Kontrollera om det finns minst två bilder i mappen
om len (bilder) < 2:
skriva ut("Det finns inte tillräckligt med bilder i mappen:", sökväg)
lämna tillbaka

# Ändra storlek på bilderna
resized_images = resize_images (bilder, bredd, höjd)

# Sy ihop bilderna
stitched_image = stitch_images (förändrade_bilder)
om stitched_image ärIngen:
skriva ut("Sömnad misslyckades för mapp:", sökväg)
lämna tillbaka

# Beskär den sammanfogade bilden
cropped_image = crop_image (sydd_bild)

# Förhandsgranska och spara den sammanfogade bilden
mappnamn = os.sökväg.basnamn (mappsökväg)
förhandsgranska_och_spara_bild (beskären_bild, mappsökväg, mappnamn)

Passera mappsökvägen som innehåller bilderna du vill sammanfoga.

stitch_folder('sample_images') 

Bilderna som du använder bör innehålla överlappande funktioner. Dessa funktioner kan vara allt från framträdande landmärken till texturmönster i bilden. OpenCV använder dem som referenspunkt för att justera bilderna.

Utan dessa funktioner blir det svårt för OpenCV att anpassa bilderna och skapa ett sömlöst panorama.

Testar ditt program

Samla bilderna som du vill förvandla till en panoramabild. Se till att de har överlappande funktioner.

Ta en titt på kullen på den här första bilden.

På den här andra bilden är kullen något synlig. Detta skapar en överlappande funktion.

Spara bilderna i en mapp. Skicka mappsökvägen till stitch_folder funktion för sömmar. Och kör sedan programmet.

Programmet sammanfogade bilderna och skapade en panoramabild med en bredare bild av scenen. Observera att för att skapa panoramabilden ovan användes nio bilder som finns i det ovan nämnda GitHub-förrådet.

Manipulation av bilder med OpenCV

Att skapa panoramabilder visar några av de många bildmanipuleringstekniker som OpenCV erbjuder. Det finns fler tekniker du kan använda för att manipulera bilder för att passa dina behov. Att arbeta med fler projekt som involverar bildmanipulation kommer att hjälpa dig att förbättra din datorseende i allmänhet.