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

Η πανοραμική φωτογραφία είναι η τεχνική λήψης ενός ευρύτερου οπτικού πεδίου που δεν μπορεί να επιτύχει μια φωτογραφία. Αυτή η τεχνική συρράπτει πολλές εικόνες μεταξύ τους για να δημιουργήσει μια ενιαία εικόνα που αποτυπώνει ολόκληρη τη σκηνή με καθηλωτικό τρόπο.

Με τη βοήθεια της Python, μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία και να δημιουργήσετε όμορφες πανοραμικές εικόνες με ευκολία.

Ρύθμιση του περιβάλλοντος Python σας

Για να συνεχίσετε, θα πρέπει να έχετε ένα βασική κατανόηση της Python. Εκκινήστε οποιοδήποτε Python IDE και δημιουργήστε ένα νέο εικονικό περιβάλλον. Δημιουργήστε ένα νέο αρχείο Python. Και στο τερματικό, εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε το OpenCV.


pip εγκατάσταση opencv-contrib-python

Θα χρησιμοποιήσετε το opencv-contrib-python βιβλιοθήκη για τη φόρτωση εικόνων και τον χειρισμό τους. Έχει το cv2.Stitcher τάξη που θα χρησιμοποιήσετε για να δημιουργήσετε τα πανοράματα.

instagram viewer

Ο πλήρης πηγαίος κώδικας και δείγματα εικόνων που χρησιμοποιούνται σε αυτό το άρθρο είναι διαθέσιμα σε αυτό Αποθετήριο GitHub.

Εισαγωγή των Απαιτούμενων Βιβλιοθηκών

Εισαγάγετε το cv2 και os ενότητες στο σενάριό σας. Θα χρησιμοποιήσετε το λειτουργικό σύστημα για να πλοηγηθείτε στις διαδρομές του συστήματος.

εισαγωγή cv2
εισαγωγή os

ο Μονάδα λειτουργικού συστήματος είναι μια ενσωματωμένη ενότητα της Python. Αυτός είναι ο λόγος που δεν χρειάζεται να το εγκαταστήσετε εξωτερικά.

Φόρτωση εικόνων

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


defload_images(folder_path):
# Φορτώστε εικόνες από έναν φάκελο και αλλάξτε το μέγεθός τους.
εικόνες = []
Για όνομα αρχείου σε os.listdir (folder_path):
# Ελέγξτε εάν το αρχείο είναι αρχείο εικόνας
αν filename.endswith(".jpg") ή filename.endswith(".png"):
# Φορτώστε την εικόνα χρησιμοποιώντας το OpenCV και αλλάξτε το μέγεθός της
image = cv2.imread (os.path.join (folder_path, όνομα αρχείου))
images.append (εικόνα)
ΕΠΙΣΤΡΟΦΗ εικόνες

Μπορείτε να προσθέσετε περισσότερες μορφές αρχείων εικόνας για να διαφοροποιήσετε το πρόγραμμά σας. Αυτός ο κωδικός θα αναζητήσει μόνο .jpg και .png μορφές αρχείων.

Αλλαγή μεγέθους των εικόνων για ομοιόμορφη βελονιά και ταχύτερη επεξεργασία

Δημιουργήστε μια συνάρτηση που θα αλλάξει το μέγεθος της λίστας των εικόνων. Η συνάρτηση θα περιηγηθεί σε κάθε εικόνα στη λίστα και θα αλλάξει το μέγεθός της. Τέλος, προσθέστε τις εικόνες που έχουν αλλάξει μέγεθος σε μια νέα λίστα.


defαλλαγή μεγέθους_εικόνων(εικόνες, πλάτος, ύψος):
resized_images = []
Για εικόνα σε εικόνες:
resized_image = cv2.resize (εικόνα, (πλάτος, ύψος))
resized_images.append (resized_image)
ΕΠΙΣΤΡΟΦΗ resized_images

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

Χρησιμοποιώντας τη μονάδα Stitcher του OpenCV για να συρράψετε τις εικόνες

Δημιουργήστε μια συνάρτηση για τη συρραφή των εικόνων με αλλαγή μεγέθους. Αυτή η τεχνική είναι κοινώς γνωστή ως δημιουργία πανοράματος. Η λειτουργία θα λάβει μια λίστα εικόνων ως είσοδο. Χρησιμοποιήστε το Ράπτων μονάδα για να τα ράψετε μεταξύ τους. Τέλος, η συνάρτηση θα επιστρέψει μια ραμμένη εικόνα και έναν κωδικό κατάστασης.


defstitch_images(εικόνες):
stitcher = cv2.Stitcher.create()
(κατάσταση, stitched_image) = stitcher.stitch (εικόνες)
αν status == cv2.STITCHER_OK:
ΕΠΙΣΤΡΟΦΗ ραμμένη_εικόνα
αλλού:
ΕΠΙΣΤΡΟΦΗΚανένας

Εάν η ραφή ήταν επιτυχής (όπως υποδεικνύεται από το cv2.STITCHER_OK κωδικός κατάστασης), η συνάρτηση θα επιστρέψει τη ραμμένη εικόνα. Διαφορετικά, θα επιστρέψει Κανένας.

Περικοπή της ραμμένης εικόνας

Δημιουργήστε μια συνάρτηση που θα λάβει τη ραμμένη εικόνα και θα την επιστρέψει αφού την περικόψετε. Πρώτα, μετατρέψτε τη ραμμένη εικόνα σε κλίμακα του γκρι. Στη συνέχεια, εφαρμόστε ένα δυαδικό όριο για να δημιουργήσετε μια δυαδική εικόνα. Τέλος, βρείτε το μεγαλύτερο περίγραμμα στη δυαδική εικόνα και υπολογίστε το οριοθετημένο ορθογώνιο της.


defΚόψε την εικονα(εικόνα):
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (γκρι, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (περιγράμματα[0])
cropped_image = εικόνα[y: y + h, x: x + w]
ΕΠΙΣΤΡΟΦΗ cropped_image

Η ραμμένη εικόνα περικόπτεται χρησιμοποιώντας το οριοθετημένο ορθογώνιο.

Προεπισκόπηση και αποθήκευση της ραμμένης εικόνας χρησιμοποιώντας το OpenCV

Δημιουργήστε μια λειτουργία που θα εμφανίζει τη ραμμένη εικόνα σε ένα διαδραστικό παράθυρο και θα την αποθηκεύει στο δίσκο.


defpreview_and_save_image(εικόνα, folder_path, folder_name):
# Εμφάνιση της ραμμένης εικόνας
cv2.namedWindow('Ραμμένη εικόνα', cv2.WINDOW_NORMAL)
cv2.imshow('Ραμμένη εικόνα', εικόνα)
cv2.waitKey(0)

# Αποθηκεύστε τη ραμμένη εικόνα
output_filename = os.path.join (folder_path, folder_name + '_panorama.jpg')
cv2.imwrite (όνομα_αρχείου εξόδου, εικόνα)
Τυπώνω('Η ραμμένη εικόνα αποθηκεύτηκε για φάκελο:', όνομα φακέλου)

Η πανοραμική εικόνα αποθηκεύεται στον ίδιο φάκελο που περιέχει τις αρχικές εικόνες.

Έλεγχος της ροής του προγράμματός σας

Δημιουργήστε μια συνάρτηση που θα ελέγχει τη ροή του προγράμματός σας. Θα φορτώσει όλες τις εικόνες από τον καθορισμένο φάκελο. Αλλάξτε το μέγεθος και ράψτε τα μεταξύ τους. Κόψτε τη ραμμένη εικόνα, εμφανίστε την προεπισκόπηση της και, στη συνέχεια, αποθηκεύστε την στο δίσκο. Εάν υπάρχουν λιγότερες από δύο εικόνες στο φάκελο, η λειτουργία θα εκτυπώσει ένα μήνυμα σφάλματος και θα επιστρέψει χωρίς να πραγματοποιήσει καμία συρραφή ή αποθήκευση.


defstitch_folder(διαδρομή_φάκελου, πλάτος=800, ύψος=800):
# Ράψτε όλες τις εικόνες σε έναν φάκελο και αποθηκεύστε το αποτέλεσμα.
# Φορτώστε τις εικόνες από το φάκελο
εικόνες = load_images (folder_path)

# Ελέγξτε εάν υπάρχουν τουλάχιστον δύο εικόνες στο φάκελο
αν len (εικόνες) < 2:
Τυπώνω("Δεν υπάρχουν αρκετές εικόνες στο φάκελο:", folder_path)
ΕΠΙΣΤΡΟΦΗ

# Αλλάξτε το μέγεθος των εικόνων
resized_images = resize_images (εικόνες, πλάτος, ύψος)

# Ράψτε τις εικόνες
stitched_image = stitch_images (resized_images)
αν ραμμένη_εικόνα είναιΚανένας:
Τυπώνω('Η συρραφή για το φάκελο απέτυχε:', folder_path)
ΕΠΙΣΤΡΟΦΗ

# Κόψτε τη ραμμένη εικόνα
cropped_image = crop_image (stitched_image)

# Κάντε προεπισκόπηση και αποθηκεύστε τη ραμμένη εικόνα
folder_name = os.path.basename (folder_path)
preview_and_save_image (cropped_image, folder_path, folder_name)

Περάστε τη διαδρομή φακέλου που περιέχει τις εικόνες που θέλετε να συρράψετε.

stitch_folder('sample_images') 

Οι εικόνες που χρησιμοποιείτε θα πρέπει να περιέχουν επικαλυπτόμενες λειτουργίες. Αυτά τα χαρακτηριστικά μπορεί να είναι οτιδήποτε, από εμφανή ορόσημα έως μοτίβα υφής στην εικόνα. Το OpenCV τα χρησιμοποιεί ως σημείο αναφοράς για να ευθυγραμμίσει τις εικόνες.

Χωρίς αυτές τις δυνατότητες, θα είναι δύσκολο για το OpenCV να ευθυγραμμίσει τις εικόνες και να δημιουργήσει ένα απρόσκοπτο πανόραμα.

Δοκιμή του προγράμματός σας

Συλλέξτε τις εικόνες που θέλετε να μετατρέψετε σε πανοραμική εικόνα. Βεβαιωθείτε ότι έχουν αλληλεπικαλυπτόμενα χαρακτηριστικά.

Ρίξτε μια ματιά στον λόφο σε αυτήν την πρώτη εικόνα.

Σε αυτή τη δεύτερη εικόνα, ο λόφος είναι ελαφρώς ορατός. Αυτό δημιουργεί ένα χαρακτηριστικό επικάλυψης.

Αποθηκεύστε τις εικόνες σε ένα φάκελο. Περάστε τη διαδρομή φακέλου στο stitch_folder λειτουργία για ραφή. Και μετά εκτελέστε το πρόγραμμα.

Το πρόγραμμα ένωσε τις εικόνες μεταξύ τους και δημιούργησε μια πανοραμική εικόνα με ευρύτερη άποψη της σκηνής. Σημειώστε ότι για τη δημιουργία της παραπάνω πανοραμικής εικόνας χρησιμοποιήθηκαν εννέα εικόνες που υπάρχουν στο προαναφερθέν αποθετήριο GitHub.

Χειρισμός εικόνων με χρήση OpenCV

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