- 1. Μετασχηματισμοί εικόνας - Μετασχηματισμός Affine και Non-Affine
- 2. Μεταφράσεις εικόνων - Μετακίνηση εικόνας πάνω, κάτω, αριστερά και δεξιά
- 3. Περιστροφή εικόνας - Περιστροφή της εικόνας
- 4. Κλίμακα, αλλαγή μεγέθους και παρεμβολή
- 5. Πυραμίδες εικόνας - Ένας άλλος τρόπος αλλαγής μεγέθους
- 6. Περικοπή - Αποκοπή της περιοχής εικόνας που θέλετε
- 7. Αριθμητικές λειτουργίες για Φωτεινότητα και Σκούρα των εικόνων
Στο προηγούμενο σεμινάριο, μάθαμε για το OpenCV και κάναμε κάποια βασική επεξεργασία εικόνων χρησιμοποιώντας το όπως γκρίζα κλιμάκωση, κορεσμός χρωμάτων, ιστόγραμμα, χρωματικούς χώρους, συστατικό RGB κ.λπ. Όπως είπε στο προηγούμενο σεμινάριο, το OpenCV είναι Open Source Commuter Vision Library που έχει C ++, Python και Java διασυνδέουν και υποστηρίζουν Windows, Linux, Mac OS, iOS και Android. Έτσι μπορεί να εγκατασταθεί εύκολα στο Raspberry Pi με περιβάλλον Python και Linux. Και το Raspberry Pi με OpenCV και συνδεδεμένη κάμερα μπορούν να χρησιμοποιηθούν για τη δημιουργία πολλών εφαρμογών επεξεργασίας εικόνας σε πραγματικό χρόνο, όπως Ανίχνευση προσώπου, κλείδωμα προσώπου, παρακολούθηση αντικειμένων, ανίχνευση πινακίδας αυτοκινήτου, σύστημα οικιακής ασφάλειας κ.λπ.
Σε αυτό το σεμινάριο, θα δούμε πώς θα χειριστούμε την εικόνα χρησιμοποιώντας το OpenCV. Εδώ θα μάθουμε να εφαρμόζουμε την ακόλουθη λειτουργία σε μια εικόνα χρησιμοποιώντας το OpenCV:
- Μετασχηματισμοί εικόνας - Μετασχηματισμός Affine και Non-Affine
- Μεταφράσεις εικόνων - Μετακίνηση εικόνας πάνω, κάτω, αριστερά και δεξιά
- Περιστροφή εικόνας - Περιστροφή της εικόνας
- Κλίμακα, αλλαγή μεγέθους και παρεμβολή
- Πυραμίδες εικόνας - Ένας άλλος τρόπος αλλαγής μεγέθους
- Περικοπή - Αποκοπή της περιοχής εικόνας που θέλετε
- Αριθμητικές λειτουργίες για Φωτεινότητα και Σκούρα των εικόνων
1. Μετασχηματισμοί εικόνας - Μετασχηματισμός Affine και Non-Affine
Οι μετασχηματισμοί είναι γεωμετρικές παραμορφώσεις που εφαρμόζονται σε μια εικόνα, οι παραμορφώσεις εδώ σίγουρα δεν σημαίνουν λάθη αλλά έναν τύπο διόρθωσης για τη διόρθωση των προοπτικών ζητημάτων που προκύπτουν από το σημείο όπου η εικόνα τραβήχτηκε. Υπάρχουν δύο τύποι μετασχηματισμών εικόνας - Affine και Non-Affine
Οι μετασχηματισμοί Affine είναι τριών τύπων κλιμάκωση, περιστροφή και μετάφραση, το σημαντικό πράγμα στις μετασχηματισμένες συγγενείς είναι ότι οι γραμμές είναι παράλληλες πριν και μετά τους μετασχηματισμούς εικόνας
Οι μη Affine μετασχηματισμοί ή οι προβολικοί μετασχηματισμοί δεν διατηρούν τον παραλληλισμό, το μήκος ή τη γωνία, αλλά διατηρεί την collinearity και την εμφάνιση, collinearity σημαίνει ότι τα δύο σημεία βρίσκονται στην ίδια ευθεία γραμμή.
Οι μετασχηματισμοί χωρίς συγγένειες είναι πολύ συχνές στην όραση του υπολογιστή και δημιουργούνται από διαφορετικές γωνίες κάμερας. Οι μη συγγενείς ή προβολικοί μετασχηματισμοί ονομάζονται επίσης ομογραφία.
2. Μεταφράσεις εικόνων - Μετακίνηση εικόνας πάνω, κάτω, αριστερά και δεξιά
Η μετάφραση εικόνας μετακινεί την εικόνα προς τα πάνω, κάτω, αριστερά και δεξιά και ακόμη και διαγώνια αν εφαρμόσουμε ταυτόχρονα τη μετάφραση x και y.
Τώρα για την εκτέλεση μεταφράσεων εικόνων χρησιμοποιούμε τη λειτουργία warpAffine του opencv, το cv2.warpAffine χρησιμοποιείται για την υλοποίηση αυτών των μεταφράσεων, αλλά για αυτό χρειαζόμαστε έναν πίνακα μετάφρασης.
Μεταφραστικός πίνακας, T = 1 0 Tx
0 1 ty
T X, T y είναι οι κατευθύνσεις στις οποίες πραγματοποιείται η αλλαγή της εικόνας.
Όπου το T X μετατοπίζεται κατά μήκος του άξονα X (Οριζόντια)
Το T Y μετατοπίζεται κατά μήκος του άξονα Υ
# Αυτό είναι ένας συσχετισμένος μετασχηματισμός που μεταθέτει απλώς τη θέση της εικόνας # χρησιμοποιούμε cv2.warpAffine την εφαρμογή αυτών των μετασχηματισμών. import cv2 import numpy as np image = cv2.imread ('input.jpg') # αποθηκεύστε το ύψος και το πλάτος του ύψους της εικόνας , το πλάτος = image.shape print (image.shape) quater_height, quater_width = ύψος / 4, πλάτος / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (εικόνα, T, (πλάτος, ύψος)) εκτύπωση (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Μετάφραση ", img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Έξοδος κονσόλας - (183, 275) - ύψος και πλάτος
- Τ μήτρα
]
3. Περιστροφή εικόνας - Περιστροφή της εικόνας
Η περιστροφή της εικόνας περιστρέφει μια εικόνα γύρω από ένα σημείο ή το σημείο στο κέντρο της εικόνας, ακριβώς όπως το περιστρεφόμενο σημείο ενεργεί σαν ένας άξονας.
Όπως στη μετάφραση έχουμε Τ μήτρα, πιθανώς σε περιστροφή έχουμε Μ μήτρα
Πίνακας περιστροφής, μήτρα Μ = Cosθ-Sin
Sinθ Cosθ
Όπου το θ είναι η γωνία περιστροφής, μετρούμενη κατά αριστερόστροφα.
Υπάρχει επίσης ένα πράγμα που πρέπει να σημειωθεί ότι το OpenCV σάς επιτρέπει να πουλάτε και να περιστρέφετε εικόνα ταυτόχρονα χρησιμοποιώντας τη λειτουργία, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angle of rotation, scale)
Εξακολουθούμε να χρησιμοποιούμε τη λειτουργία warpAffine του opencv για να έχουμε την περιστροφή της εικόνας, αλλά αντί του πίνακα μετάφρασης όπως στην προηγούμενη περίπτωση εδώ χρησιμοποιούμε τον πίνακα περιστροφής.
import cv2 import numpy as np image = cv2.imread ('input.jpg') ύψος, πλάτος = image.shape # διαιρέστε το ύψος και το πλάτος κατά 2 για να περιστρέψετε την εικόνα σχετικά με το κέντρο περιστροφής_matrix = cv2.getRotationMatrix2D ((πλάτος / 2), ύψος / 2), 90,1) rotated_image = cv2.warpAffine (εικόνα, rotation_matrix, (πλάτος, ύψος)) cv2.imshow («αρχική εικόνα», εικόνα) cv2.waitKey (0) cv2.imshow («περιστρεφόμενη εικόνα ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Τώρα η εικόνα περιστρέφεται κατά 90 μοίρες, περικόπτεται λόγω του μεγέθους του καμβά, καθώς το μέγεθος του καμβά παραμένει το ίδιο, αλλά λόγω της περιστροφής το μέγεθος της εικόνας δεν ταιριάζει στο μέγεθος του καμβά. Θα μπορούσε να ρυθμιστεί ρυθμίζοντας τον συντελεστή κλιμάκωσης σε αρνητικό, αλλά επιτρέπει ένα μαύρο φόντο πίσω από την εικόνα.
Έτσι, μπορείτε να ορίσετε το ύψος και το πλάτος της εικόνας προβλέποντάς την ή μαντέψτε την ή υπάρχει μια άλλη μέθοδο περιστροφής της εικόνας με τη μεταφορά της, αλλά θα περιστρέψει την εικόνα με τα πολλαπλάσια των 90 μοιρών κατά αριστερόστροφη κατεύθυνση.
4. Κλίμακα, αλλαγή μεγέθους και παρεμβολή
Η κλιμάκωση και η αλλαγή μεγέθους είναι συσχετισμένοι μετασχηματισμοί, το μέγεθος της εικόνας είναι αυτό που κάναμε αρκετό καιρό και έχουμε επίσης ασχοληθεί με την παρεμβολή, όπως όταν αλλάζετε το μέγεθος της εικόνας σε μεγαλύτερο μέγεθος στο οποίο επεκτείνουμε τα εικονοστοιχεία, υπάρχουν ορισμένα κενά στο pixels και εκεί έρχεται η παρεμβολή.
Μπορεί να συμβεί κατά την αύξηση του μεγέθους της εικόνας από μικρότερο σε μεγαλύτερο ή μείωση του μεγέθους της εικόνας από μεγαλύτερο σε μικρότερο.
Από τεχνική άποψη, η παρεμβολή είναι μια μέθοδος δημιουργίας νέων σημείων δεδομένων (pixel), εντός διακριτού συνόλου γνωστών σημείων δεδομένων.
Υπάρχουν διάφοροι τύποι μεθόδων παρεμβολής στο OpenCV όπως
cv2.INTER_AREA - καλό για συρρίκνωση ή μείωση δειγματοληψίας
cv2.INTER_NEAREST - ταχύτερα
cv2.LINEAR - καλό για μεγέθυνση ή αύξηση δειγματοληψίας (προεπιλογή)
cv2.CUBIC - καλύτερα
cv2.INTER_LANCZOS4 - καλύτερο
Η αλλαγή μεγέθους # είναι πολύ εύκολη χρησιμοποιώντας τη συνάρτηση cv2.resize, τα ορίσματά της είναι # cv2.resize (εικόνα, μέγεθος (μέγεθος εικόνας εξόδου), x_scale, y_scale, interpolation) εισαγωγή cv2 numpy εισαγωγής ως np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # ας κάνουμε την εικόνα 3/4 το αρχικό μέγεθος της εικόνας, δηλαδή κλιμακώνεται έως και 75% image_scaled = cv2.resize (εικόνα, Καμία, fx = 0,75, fy = 0,75) # Δεδομένου ότι η γραμμική παρεμβολή είναι η προεπιλεγμένη μέθοδος για ανοιχτό βιογραφικό, δεν χρειάζεται να την εφαρμόσουμε ως συνάρτηση. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # ας διπλασιάσουμε το μέγεθος της εικόνας μας img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # ας κάνουμε το μέγεθος με ακριβείς διαστάσεις image_resize = cv2.resize (εικόνα, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact' image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Πυραμίδες εικόνας - Ένας άλλος τρόπος αλλαγής μεγέθους
Η εικόνα πυραμίδης αναφέρεται είτε στην αναβάθμιση (μεγέθυνση εικόνων) είτε στην κάτω κλίμακα (συρρικνούμενες εικόνες).
Είναι απλώς ένας διαφορετικός τρόπος αλλαγής μεγέθους που μας επιτρέπει να κλιμακώσουμε εύκολα και γρήγορα εικόνες, μειώνοντας κατά το ήμισυ το ύψος και το πλάτος της νέας εικόνας.
Αυτό είναι χρήσιμο όταν δημιουργείτε ανιχνευτές αντικειμένων που κλιμακώνουν τις εικόνες κάθε φορά που αναζητά ένα αντικείμενο.
cv2 εισαγωγής εικόνας = cv2.imread ('input.jpg') μικρότερων = cv2.pyrDown (εικόνας) μεγαλύτερο = cv2.pyrUp (μικρότερα) cv2.imshow ('αρχική', εικόνας) cv2.waitKey (0) cv2.imshow («μικρότερο», μικρότερο) cv2.waitKey (0) cv2.imshow («μεγαλύτερο», μεγαλύτερο) cv2.waitKey (0) cv2.destroyAllWindows ()
Σε μεγαλύτερη εικόνα θα παρατηρήσετε ότι εξακολουθεί να έχει το ίδιο μέγεθος της αρχικής εικόνας, είναι λίγο θολή, επειδή μετατρέπεται απευθείας από μικρότερη σε μεγαλύτερη εικόνα. Αλλά αν το παρεμβάλουμε, η ποιότητα της εικόνας βελτιώνεται από την προηγούμενη, επειδή η παρεμβολή εκτιμά τα pixel ενώ γεμίζει τα κενά όταν μεγεθύνεται η εικόνα.
Τώρα που εκτελεί τον ίδιο κώδικα, αλλά με κυβική παρεμβολή δίνει καλύτερη ποιότητα μεγάλης εικόνας. Οι παρακάτω εικόνες δείχνουν τη σύγκριση μεταξύ της αρχικής εικόνας, της κλιμακούμενης έκδοσης της εικόνας, της μικρότερης εικόνας και της κυβικής παρεμβολής έκδοσης της μικρότερης εικόνας.
cv2 εισαγωγής εικόνας = cv2.imread ('input.jpg') μικρότερων = cv2.pyrDown (εικόνας) μεγαλύτερο = cv2.pyrUp (μικρότερα) cv2.imshow ('αρχική', εικόνας) cv2.waitKey (0) cv2.imshow («μικρότερο», μικρότερο) cv2.waitKey (0) cv2.imshow («μεγαλύτερο», μεγαλύτερο) cv2.waitKey (0) # αυξάνοντας την ποιότητα της μετατροπής μεγαλύτερης εικόνας από μικρότερη εικόνα χρησιμοποιώντας κυβική παρεμβολή img_double = cv2.resize (μικρότερο Κανένα, fx = 2, fy = 2, παρεμβολή = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
ΣΗΜΕΙΩΣΗ: Αν θέλετε να δημιουργήσετε πολλαπλά μικρά αντίγραφα των εικόνων πηγαίνει όλο και μικρότερα σε μέγεθος ή πολλές μεγάλες αντίγραφα των εικόνων διαρκώς αυξάνονται σε μέγεθος, τότε μπορούμε να χρησιμοποιήσουμε για βρόχους ή ενώ βρόχους κρατώντας μέσα pyrDown ή pyrUp λειτουργία.
6. Περικοπή - Αποκοπή της περιοχής εικόνας που θέλετε
Η περικοπή εικόνων αναφέρεται στην εξαγωγή τμήματος εικόνας.
Το OpenCV άμεσα δεν έχει λειτουργία περικοπής, αλλά μπορεί εύκολα να γίνει με numpy χρησιμοποιώντας τον παρακάτω κώδικα
Περικομμένη = εικόνα
Βάζουμε τον πίνακα εικόνων και χρησιμοποιούμε εργαλεία ευρετηρίου ή μέθοδο στο numpy, ορίζουμε τη γραμμή έναρξης έως τη σειρά και την στήλη έναρξης έως την τελική στήλη διαχωρισμένες με κόμμα που εξάγει το ορθογώνιο που θέλουμε να περικόψουμε για να λάβουμε την εικόνα.
import cv2 import numpy as np image = cv2.imread ('input.jpg') ύψος, πλάτος = image.shape # ας πάρουμε τις αρχικές συντεταγμένες pixel (πάνω αριστερά του ορθογωνίου περικοπής) start_row, start_col = int (ύψος *.25), int (πλάτος *.25) # ας πάρουμε τελικές συντεταγμένες εικονοστοιχείων (κάτω δεξιά) end_row, end_col = int (ύψος *.75), int (πλάτος *.75) # απλά χρησιμοποιήστε την ευρετηρίαση για να περικόψετε το ορθογώνιο που επιθυμούμε περικομμένο = εικόνα cv2.imshow ("αρχική εικόνα", εικόνα) cv2.waitKey (0) cv2.imshow ("περικομμένη εικόνα", περικομμένη) cv2.waitKey (0) cv2.destroyAllWindows ()
Σημειώστε ότι μπορείτε να χρησιμοποιήσετε τιμές pixel απευθείας αντί για start_col ή start_row , δίνονται απλώς για την εύκολη αναγνώριση του χρήστη.
7. Αριθμητικές λειτουργίες για Φωτεινότητα και Σκούρα των εικόνων
Οι αριθμητικές λειτουργίες στο OpenCV βασικά είναι η προσθήκη ή αφαίρεση πινάκων στην εικόνα, η προσθήκη ή η αφαίρεση πινάκων επηρεάζει την αύξηση ή τη μείωση της φωτεινότητας.
Για να προσθέσουμε ή να αφαιρέσουμε μήτρες πρέπει να τους δημιουργήσουμε και το numpy έχει μια συνάρτηση που ονομάζεται np.ones που δίνει πίνακες του ίδιου μεγέθους με την εικόνα μας.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # δημιουργήστε μια μήτρα κάποιου και, στη συνέχεια, πολλαπλασιάστε την με ένα scaler των 100 ' # np.ones δίνει μια μήτρα με την ίδια διάσταση με την εικόνα μας με όλα οι τιμές είναι 100 σε αυτήν την περίπτωση M = np.ones (image.shape, dtype = "uint8") * 100 # το χρησιμοποιούμε για να προσθέσουμε αυτό το matrix M στην εικόνα μας # σημειώστε την αύξηση της φωτεινότητας που προστέθηκε = cv2.add (εικόνα, M) cv2.imshow ("Προστέθηκε", προστέθηκε) cv2.waitKey (0) # παρόμοια μπορούμε επίσης να αφαιρέσουμε # παρατηρήστε τη μείωση της φωτεινότητας αφαιρεθεί = cv2.subtract (εικόνα, M) cv2.imshow ("αφαιρέθηκε", αφαιρέθηκε) cv2.waitKey (0) cv2.destroyAllWindows ()
Με αυτόν τον τρόπο το OpenCV μπορεί να χρησιμοποιηθεί για την εφαρμογή πολλών διαφορετικών λειτουργιών επεξεργασίας εικόνας στην εικόνα. Θα συνεχίσουμε με άλλες λειτουργίες χειρισμού εικόνων στο επόμενο σεμινάριο.