OpenCV Python biblioteka omogućila je automatizaciju procesa spajanja više slika u jednu panoramsku sliku.

Panoramska fotografija je tehnika snimanja šireg vidnog polja koju jedna fotografija ne može postići. Ova tehnika spaja više slika kako bi se stvorila jedna slika koja hvata cijelu scenu na impresivan način.

Uz pomoć Pythona možete automatizirati ovaj proces i s lakoćom stvarati prekrasne panorame.

Postavljanje vašeg Python okruženja

Da biste ga slijedili, trebali biste imati a osnovno razumijevanje Pythona. Pokrenite bilo koji Python IDE i stvoriti novo virtualno okruženje. Stvorite novu Python datoteku. I na terminalu pokrenite sljedeću naredbu da instalirate OpenCV.


pip instalirajte opencv-contrib-python

Vi ćete koristiti opencv-contrib-python knjižnica za učitavanje slika i rukovanje njima. Ima cv2.Švačica klase koju ćete koristiti za izradu panorama.

Cijeli izvorni kod i uzorci slika korišteni u ovom članku dostupni su ovdje GitHub spremište.

Uvoz potrebnih biblioteka

Uvezi cv2 i os module u svoju skriptu. Za navigaciju kroz sistemske staze koristit ćete OS.

instagram viewer
uvoz cv2
uvoz os

The OS modul je ugrađeni modul Pythona. To je razlog zašto ga ne morate instalirati izvana.

Učitavanje slika

Napravite funkciju za učitavanje slika koje želite spojiti. Prvo stvorite prazan popis koji će pohraniti početne slike. Zatim prođite kroz svaku datoteku u putanji mape provjeravajući je li datoteka slika. Ako se radi o slici, učitajte je i dodajte na popis slika.


defučitaj_slike(staza_mape):
# Učitajte slike iz mape i promijenite im veličinu.
slike = []
za naziv datoteke u os.listdir (staza_mape):
# Provjerite je li datoteka slikovna datoteka
ako naziv datoteke.endswith('.jpg') ili naziv datoteke.endswith('.png'):
# Učitajte sliku koristeći OpenCV i promijenite joj veličinu
slika = cv2.imread (os.path.join (put_mape, naziv datoteke))
images.append (slika)
povratak slike

Možete dodati više formata slikovnih datoteka kako biste obogatili svoj program. Ovaj kod će samo tražiti .jpg i .png formati datoteka.

Promjena veličine slika za jednoličan spoj i bržu obradu

Napravite funkciju koja će promijeniti veličinu popisa slika. Funkcija će proći kroz svaku sliku na popisu i promijeniti joj veličinu. Na kraju, dodajte slike promijenjene veličine na novi popis.


defpromjena veličine_slike(slike, širina, visina):
promijenjene_slike = []
za slika u slike:
resized_image = cv2.resize (slika, (širina, visina))
promijenjene_slike.dodaj (promijenjene_slike)
povratak promijenjene_slike

Promjena veličine osigurava ujednačenost spajanja slika. Također smanjuje veličinu datoteke radi brže obrade.

Korištenje modula za spajanje OpenCV-a za spajanje slika

Napravite funkciju za spajanje slika promijenjene veličine. Ova tehnika je poznata kao stvaranje panorame. Funkcija će uzeti popis slika kao ulaz. Koristiti Krojač modul za spajanje. Konačno, funkcija će vratiti spojenu sliku i statusni kod.


defšav_slike(slike):
šivač = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (slike)
ako status == cv2.STITCHER_OK:
povratak spojena_slika
drugo:
povratakNijedan

Ako je spajanje bilo uspješno (kao što pokazuje cv2.STITCHER_OK statusni kod), funkcija će vratiti spojenu sliku. Inače će se vratiti Nijedan.

Obrezivanje spojene slike

Napravite funkciju koja će preuzeti spojenu sliku i vratiti je nakon izrezivanja. Prvo pretvorite spojenu sliku u sive nijanse. Zatim primijenite binarni prag za stvaranje binarne slike. Konačno, pronađite najveću konturu u binarnoj slici i izračunajte njen granični pravokutnik.


defizreži sliku(slika):
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY)
threshold = cv2.threshold (siva, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (konture[0])
izrezana_slika = slika[y: y + h, x: x + w]
povratak izrezana_slika

Spojena slika je izrezana pomoću graničnog pravokutnika.

Pregled i spremanje spojene slike pomoću OpenCV-a

Napravite funkciju koja će prikazati spojenu sliku u interaktivnom prozoru i spremiti je na disk.


defpreview_and_save_image(slika, folder_path, folder_name):
# Prikažite spojenu sliku
cv2.namedWindow('Spojena slika', cv2.WINDOW_NORMAL)
cv2.imshow('Spojena slika', slika)
cv2.waitKey(0)

# Spremite spojenu sliku
output_filename = os.path.join (folder_path, folder_name + '_panorama.jpg')
cv2.imwrite (ime_izlazne_datoteke, slika)
ispis('Spojena slika spremljena za mapu:', ime datoteke)

Panoramska slika sprema se u istu mapu u kojoj se nalaze izvorne slike.

Kontrola tijeka vašeg programa

Napravite funkciju koja će kontrolirati tijek vašeg programa. Učitat će sve slike iz navedene mape. Promijenite veličinu i spojite ih zajedno. Izrežite spojenu sliku, prikažite njen pregled i zatim je spremite na disk. Ako u mapi ima manje od dvije slike, funkcija će ispisati poruku o pogrešci i vratiti se bez spajanja ili spremanja.


defmapa_boda(staza_mape, širina=800, visina=800):
# Povežite sve slike u mapu i spremite rezultat.
# Učitajte slike iz mape
slike = učitaj_slike (staza_mape)

# Provjerite postoje li barem dvije slike u mapi
ako len (slike) < 2:
ispis('Nema dovoljno slika u mapi:', mapa_staza)
povratak

# Promjena veličine slika
resized_images = resize_images (slike, širina, visina)

# Spojite slike
stitched_image = stitch_images (promijenjene veličine_slike)
ako spojena_slika jeNijedan:
ispis('Spajanje nije uspjelo za mapu:', mapa_staza)
povratak

# Izrežite spojenu sliku
izrezana_slika = izrezana_slika (spojena_slika)

# Pregledajte i spremite spojenu sliku
folder_name = os.path.basename (folder_path)
preview_and_save_image (izrezana_slika, put_mape, naziv_mape)

Proslijedite putanju mape koja sadrži slike koje želite spojiti.

stitch_folder('uzorak_slika') 

Slike koje koristite trebaju sadržavati značajke koje se preklapaju. Te značajke mogu biti bilo što, od istaknutih znamenitosti do uzoraka teksture na slici. OpenCV ih koristi kao referentnu točku za poravnavanje slika.

Bez ovih značajki OpenCV-u će biti teško uskladiti slike i stvoriti besprijekornu panoramu.

Testiranje vašeg programa

Prikupite slike koje želite pretvoriti u panoramsku sliku. Osigurajte da imaju preklapajuće značajke.

Pogledajte brdo na ovoj prvoj slici.

Na ovoj drugoj slici brdo je malo vidljivo. Ovo stvara značajku koja se preklapa.

Spremite slike u mapu. Proslijedite put mape do mapa_boda funkcija za šivanje. I zatim pokrenite program.

Program je spojio slike i stvorio panoramsku sliku sa širim pogledom na scenu. Imajte na umu da je za izradu gornje panoramske slike korišteno devet slika koje se nalaze u gore spomenutom GitHub repozitoriju.

Manipulacija slikama pomoću OpenCV-a

Stvaranje panorama pokazuje neke od mnogih tehnika manipulacije slikama koje OpenCV nudi. Postoji više tehnika koje možete koristiti za manipuliranje slikama prema vašim potrebama. Rad na većem broju projekata koji uključuju manipulaciju slikama pomoći će vam poboljšati svoje vještine računalnog vida općenito.