Stvaranje zapanjujućih panoramskih fotografija s Python OpenCV-om

Spajanje slika pomoću Python OpenCV-a uključuje kombiniranje više slika za stvaranje panoramskog ili širokog prikaza. Ovaj se postupak obično koristi u fotografiji za spajanje preklapajućih slika i stvaranje besprijekorne panorame. Ovdje je osnovni pregled kako spojiti slike pomoću OpenCV-a:

Predobrada slike

Učitajte slike koje želite spojiti pomoću OpenCV cv2.imread() funkcije.

Pretvorite slike u sive tonove pomoću cv2.cvtColor() ako je potrebno.

Otkrijte ključne značajke na slikama pomoću algoritama za detekciju značajki kao što su SIFT, ORB ili AKAZE.

Podudaranje značajki

Upotrijebite tehnike podudaranja značajki kako biste pronašli odgovarajuće točke između slika.

OpenCV pruža funkcije poput cv2.BFMatcher() ili cv2.FlannBasedMatcher() za podudaranje značajki.

Homografska procjena

Izračunajte homografsku matricu koristeći odgovarajuće točke pronađene u prethodnom koraku.

Homografska matrica opisuje transformaciju između dvije slike.

Savijanje i šivanje

Upotrijebite homografsku matricu da iskrivite jednu od slika kako bi se poravnala s drugom.

Funkcija cv2.warpPerspective() se može koristiti u tu svrhu.

Kombinirajte iskrivljenu sliku s drugom slikom kako biste stvorili spojenu panoramu.

Miješanje(nije obavezno)

Primijenite tehnike miješanja slika kako biste neprimjetno spojili spojene slike.

Mogu se koristiti tehnike poput linearnog miješanja ili višepojasnog miješanja.

Prikaz ili spremanje

Prikažite spojenu panoramu pomoću cv2.imshow() ili je spremite pomoću cv2.imwrite().

 

Evo pojednostavljenog primjera koda koji demonstrira proces spajanja slike pomoću OpenCV-a:

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()  

Imajte na umu da je ovaj primjer pojednostavljena demonstracija. U praksi ćete možda morati riješiti probleme kao što su poravnanje slike, stapanje i korekcija izobličenja kako biste postigli visokokvalitetne panoramske slike.