Δημιουργία εκπληκτικών πανοραμικών φωτογραφιών με το Python OpenCV

Η συρραφή εικόνων με χρήση Python και OpenCV περιλαμβάνει το συνδυασμό πολλών εικόνων για τη δημιουργία πανοραμικής ή ευρείας προβολής. Αυτή η διαδικασία χρησιμοποιείται συνήθως στη φωτογραφία για τη συγχώνευση επικαλυπτόμενων εικόνων και τη δημιουργία ενός απρόσκοπτου πανοράματος. Ακολουθεί μια βασική περιγραφή του τρόπου συρραφής εικόνων χρησιμοποιώντας το OpenCV:

Προεπεξεργασία εικόνας

Φορτώστε τις εικόνες που θέλετε να συρράψετε χρησιμοποιώντας cv2.imread() τη λειτουργία του OpenCV.

Μετατρέψτε τις εικόνες σε κλίμακα του γκρι χρησιμοποιώντας cv2.cvtColor() εάν είναι απαραίτητο.

Εντοπίστε βασικά χαρακτηριστικά στις εικόνες χρησιμοποιώντας αλγόριθμους ανίχνευσης χαρακτηριστικών όπως SIFT, ORB ή AKAZE.

Αντιστοίχιση χαρακτηριστικών

Χρησιμοποιήστε τεχνικές αντιστοίχισης χαρακτηριστικών για να βρείτε τα αντίστοιχα σημεία μεταξύ των εικόνων.

Το OpenCV παρέχει λειτουργίες όπως cv2.BFMatcher() ή cv2.FlannBasedMatcher() για αντιστοίχιση χαρακτηριστικών.

Εκτίμηση ομογραφίας

Υπολογίστε τον πίνακα ομογραφίας χρησιμοποιώντας τα αντίστοιχα σημεία που βρέθηκαν στο προηγούμενο βήμα.

Η μήτρα ομογραφίας περιγράφει τον μετασχηματισμό μεταξύ των δύο εικόνων.

Στρεβλώσεις και ραφές

Χρησιμοποιήστε τη μήτρα ομογραφίας για να παραμορφώσετε μία από τις εικόνες ώστε να ευθυγραμμιστεί με την άλλη.

Η cv2.warpPerspective() λειτουργία μπορεί να χρησιμοποιηθεί για αυτό το σκοπό.

Συνδυάστε τη στρεβλή εικόνα με την άλλη εικόνα για να δημιουργήσετε το ραμμένο πανόραμα.

Ανάμειξη(προαιρετικό)

Εφαρμόστε τεχνικές ανάμειξης εικόνων για να συγχωνεύσετε απρόσκοπτα τις ραμμένες εικόνες.

Μπορούν να χρησιμοποιηθούν τεχνικές όπως η γραμμική ανάμειξη ή η ανάμειξη πολλαπλών ζωνών.

Εμφάνιση ή Αποθήκευση

Εμφανίστε το ραμμένο πανόραμα χρησιμοποιώντας cv2.imshow() ή αποθηκεύστε το χρησιμοποιώντας cv2.imwrite().

 

Ακολουθεί ένα απλοποιημένο παράδειγμα κώδικα που δείχνει τη διαδικασία συρραφής εικόνας χρησιμοποιώντας το 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()  

Λάβετε υπόψη ότι αυτό το παράδειγμα είναι μια απλοποιημένη επίδειξη. Στην πράξη, μπορεί να χρειαστεί να χειριστείτε ζητήματα όπως η ευθυγράμμιση εικόνας, η ανάμειξη και η διόρθωση παραμόρφωσης για να επιτύχετε πανοραμικές εικόνες υψηλής ποιότητας.