Ustvarjanje osupljivih panoramskih fotografij z Python OpenCV

Sestavljanje slik z uporabo Python in OpenCV vključuje združevanje več slik za ustvarjanje panoramskega ali širokega pogleda. Ta postopek se običajno uporablja v fotografiji za združevanje prekrivajočih se slik in ustvarjanje brezhibne panorame. Tukaj je osnovni oris, kako sestaviti slike z uporabo OpenCV:

Predobdelava slike

Naložite slike, ki jih želite sestaviti s cv2.imread() funkcijo OpenCV.

Po potrebi pretvorite slike v sivine cv2.cvtColor().

Zaznajte ključne značilnosti na slikah z algoritmi za zaznavanje funkcij, kot so SIFT, ORB ali AKAZE.

Ujemanje funkcij

Uporabite tehnike ujemanja funkcij, da poiščete ustrezne točke med slikama.

OpenCV ponuja funkcije, kot je cv2.BFMatcher() ali cv2.FlannBasedMatcher() za ujemanje funkcij.

Homografska ocena

Izračunajte homografsko matriko z uporabo ustreznih točk, ki ste jih našli v prejšnjem koraku.

Homografska matrika opisuje transformacijo med obema slikama.

Upogibanje in šivanje

Uporabite homografsko matrico, da ukrivite eno od slik, da se poravna z drugo.

cv2.warpPerspective() V ta namen lahko uporabite funkcijo .

Združite izkrivljeno sliko z drugo sliko, da ustvarite sestavljeno panoramo.

Mešanje(neobvezno)

Uporabite tehnike mešanja slik, da neopazno združite sestavljene slike.

Uporabite lahko tehnike, kot je linearno mešanje ali večpasovno mešanje.

Prikaži ali shrani

Prikažite sestavljeno panoramo z cv2.imshow() ali jo shranite z cv2.imwrite().

 

Tukaj je poenostavljen primer kode, ki prikazuje postopek sestavljanja slik z uporabo OpenCV:

import cv2  
  
# Load images  
image1 = cv2.imread('image1.jpg')  
image2 = cv2.imread('image2.jpg')  
  
# Convert images to grayscale  
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)  
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)  
  
# Detect key features and descriptors  
orb = cv2.ORB_create()  
keypoints1, descriptors1 = orb.detectAndCompute(gray1, None)  
keypoints2, descriptors2 = orb.detectAndCompute(gray2, None)  
  
# Feature matching  
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)  
matches = matcher.match(descriptors1, descriptors2)  
  
# Apply ratio test to filter good matches  
matches = [match for match in matches if match.distance < 0.7 * max(len(matches), 1)]  
  
# Find corresponding points  
src_pts = [keypoints1[match.queryIdx].pt for match in matches]  
dst_pts = [keypoints2[match.trainIdx].pt for match in matches]  
  
# Calculate homography matrix  
homography, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)  
  
# Warp and stitch images  
stitched_image = cv2.warpPerspective(image1, homography,(image1.shape[1] + image2.shape[1], image1.shape[0]))  
stitched_image[0:image2.shape[0], 0:image2.shape[1]] = image2  
  
# Display or save the stitched image  
cv2.imshow('Stitched Image', stitched_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Upoštevajte, da je ta primer poenostavljena predstavitev. V praksi boste morda morali obravnavati težave, kot so poravnava slike, mešanje in popravek popačenja, da boste dosegli visokokakovostne panoramske slike.