Knjižnica OpenCV Python je omogočila avtomatizacijo postopka združevanja več slik v eno samo panoramsko sliko.

Panoramska fotografija je tehnika zajemanja širšega vidnega polja, ki ga ena sama fotografija ne more doseči. Ta tehnika združi več slik skupaj, da ustvari eno samo sliko, ki zajame celotno sceno na impresiven način.

S pomočjo Pythona lahko avtomatizirate ta proces in z lahkoto ustvarite čudovite panorame.

Nastavitev vašega okolja Python

Če želite slediti, bi morali imeti a osnovno razumevanje Pythona. Zaženite kateri koli Python IDE in ustvarite novo virtualno okolje. Ustvarite novo datoteko Python. In na terminalu zaženite naslednji ukaz za namestitev OpenCV.


pip namestite opencv-contrib-python

Uporabili boste opencv-contrib-python knjižnico za nalaganje slik in njihovo obdelavo. Ima cv2.Stitcher razred, ki ga boste uporabili za ustvarjanje panoram.

Celotna izvorna koda in vzorčne slike, uporabljene v tem članku, so na voljo tukaj Repozitorij GitHub.

Uvažanje zahtevanih knjižnic

Uvozite cv2 in os modulov v vaš skript. Za krmarjenje po sistemskih poteh boste uporabljali OS.

instagram viewer
uvoz cv2
uvoz os

The OS modul je vgrajeni modul Pythona. To je razlog, da ga ni treba namestiti zunaj.

Nalaganje slik

Ustvarite funkcijo za nalaganje slik, ki jih želite sestaviti. Najprej ustvarite prazen seznam, ki bo shranil začetne slike. Nato preglejte vsako datoteko na poti mape in preverite, ali je datoteka slika. Če je slika, jo naložite in dodajte na seznam slik.


defload_images(pot_mape):
# Naložite slike iz mape in jim spremenite velikost.
slike = []
za Ime datoteke v os.listdir (pot_mape):
# Preverite, ali je datoteka slikovna datoteka
če filename.endswith('.jpg') oz filename.endswith('.png'):
# Naložite sliko z uporabo OpenCV in ji spremenite velikost
slika = cv2.imread (os.path.join (pot_mape, ime datoteke))
images.append (slika)
vrnitev slike

Za popestritev programa lahko dodate več formatov slikovnih datotek. Ta koda bo samo iskala .jpg in .png formati datotek.

Spreminjanje velikosti slik za enoten šiv in hitrejšo obdelavo

Ustvarite funkcijo, ki bo spremenila velikost seznama slik. Funkcija bo preletela vsako sliko na seznamu in ji spremenila velikost. Nazadnje dodajte spremenjene slike na nov seznam.


defresize_images(slike, širina, višina):
spremenjene_slike = []
za slika v slike:
resized_image = cv2.resize (slika, (širina, višina))
resized_images.append (spremenjena_slika)
vrnitev spremenjene_slike

Spreminjanje velikosti poskrbi, da je sestavljanje slik enakomerno. Prav tako zmanjša velikost datoteke za hitrejšo obdelavo.

Uporaba modula Stitcher OpenCV za spajanje slik

Ustvarite funkcijo za sestavljanje slik spremenjene velikosti. Ta tehnika je splošno znana kot ustvarjanje panorame. Funkcija bo kot vhod vzela seznam slik. Uporabi Šivalnica modul, da jih povežete skupaj. Končno bo funkcija vrnila sestavljeno sliko in statusno kodo.


defstitch_images(slike):
stitcher = cv2.Stitcher.create()
(stanje, stitched_image) = stitcher.stitch (slike)
če stanje == cv2.STITCHER_OK:
vrnitev stitched_image
drugače:
vrnitevNoben

Če je bilo šivanje uspešno (kot kaže cv2.STITCHER_OK kodo stanja), bo funkcija vrnila sestavljeno sliko. V nasprotnem primeru se bo vrnilo Noben.

Obrezovanje sestavljene slike

Ustvarite funkcijo, ki bo prevzela sestavljeno sliko in jo po obrezovanju vrnila. Najprej pretvorite sestavljeno sliko v sivine. Nato uporabite binarni prag, da ustvarite binarno sliko. Končno poiščite največjo konturo v binarni sliki in izračunajte njen mejni pravokotnik.


defcrop_image(slika):
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY)
thresh = 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])
obrezana_slika = slika[y: y + h, x: x + w]
vrnitev obrezana_slika

Sestavljena slika je obrezana z uporabo omejevalnega pravokotnika.

Predogled in shranjevanje sestavljene slike z uporabo OpenCV

Ustvarite funkcijo, ki bo prikazala sestavljeno sliko v interaktivnem oknu in jo shranila na disk.


defpreview_and_save_image(slika, pot_mape, ime_mape):
# Prikažite sestavljeno sliko
cv2.namedWindow('Sestavljena slika', cv2.WINDOW_NORMAL)
cv2.imshow('Sestavljena slika', slika)
cv2.waitKey(0)

# Shranite sestavljeno sliko
ime_izhodne_datoteke = os.path.join (pot_mape, ime_mape + '_panorama.jpg')
cv2.imwrite (ime_izhodne_datoteke, slika)
natisni('Sestavljena slika shranjena v mapo:', ime_mape)

Panoramska slika se shrani v isto mapo, v kateri so originalne slike.

Nadzor poteka vašega programa

Ustvarite funkcijo, ki bo nadzorovala potek vašega programa. Naložil bo vse slike iz določene mape. Spremenite velikost in jih sešijte skupaj. Obrežite sestavljeno sliko, prikažite njen predogled in jo nato shranite na disk. Če sta v mapi manj kot dve sliki, bo funkcija natisnila sporočilo o napaki in se vrnila brez sestavljanja ali shranjevanja.


defstitch_folder(pot_mape, širina=800, višina=800):
# Povežite vse slike v mapi in shranite rezultat.
# Naložite slike iz mape
slike = naloži_slike (pot_mape)

# Preverite, ali sta v mapi vsaj dve sliki
če len (slike) < 2:
natisni('V mapi ni dovolj slik:', pot_mape)
vrnitev

# Spremenite velikost slik
resized_images = resize_images (slike, širina, višina)

# Sešite slike
stitched_image = stitch_images (spremenjena velikost_slik)
če stitched_image jeNoben:
natisni('Sestavljanje ni uspelo za mapo:', pot_mape)
vrnitev

# Obrežite sestavljeno sliko
obrezana_slika = obrezana_slika (zlepljena_slika)

# Predogled in shranjevanje sestavljene slike
ime_mape = os.path.basename (pot_mape)
preview_and_save_image (obrezana_slika, pot_mape, ime_mape)

Podajte pot do mape, ki vsebuje slike, ki jih želite sestaviti.

stitch_folder('vzorčne_slike') 

Slike, ki jih uporabljate, morajo vsebovati prekrivajoče se elemente. Te značilnosti so lahko vse od vidnih znamenitosti do vzorcev teksture na sliki. OpenCV jih uporablja kot referenčno točko za poravnavo slik.

Brez teh funkcij bo OpenCV težko poravnal slike in ustvaril brezhibno panoramo.

Testiranje vašega programa

Zberite slike, ki jih želite pretvoriti v panoramsko sliko. Prepričajte se, da imajo funkcije, ki se prekrivajo.

Oglejte si hrib na tej prvi sliki.

Na tej drugi sliki je hrib rahlo viden. To ustvari prekrivajočo se funkcijo.

Shranite slike v mapo. Posredujte pot do mape stitch_folder funkcijo za šivanje. In nato zaženite program.

Program je sestavil slike in ustvaril panoramsko sliko s širšim pogledom na prizorišče. Upoštevajte, da je bilo za ustvarjanje zgornje panoramske slike uporabljenih devet slik, ki so prisotne v zgoraj omenjenem repozitoriju GitHub.

Manipulacija s slikami z uporabo OpenCV

Ustvarjanje panoram prikazuje nekatere od številnih tehnik obdelave slik, ki jih ponuja OpenCV. Obstaja več tehnik, ki jih lahko uporabite za manipulacijo s slikami, ki ustrezajo vašim potrebam. Delo na več projektih, ki vključujejo obdelavo slik, vam bo pomagalo izboljšati vaše sposobnosti računalniškega vida na splošno.