- 1. Λειτουργίες και κάλυψη Bitwise
- 2. Συνέλευση & θόλωση
- 3. Sharpening - Αντιστροφή θολώνει την εικόνα
- 4. Threshoding (Binarization)
- 5. Διαστολή, διάβρωση, άνοιγμα / κλείσιμο
- 6. Ανίχνευση άκρων και κλίσεις εικόνας
- 14. Προοπτική και συναισθηματικός μετασχηματισμός
- 8. Εφαρμογή Live Sketch
Στα προηγούμενα σεμινάρια, μάθαμε για το OpenCV και κάναμε κάποια βασική επεξεργασία εικόνας και στη συνέχεια στο επόμενο σεμινάριο κάναμε κάποια επεξεργασία εικόνας στο OpenCV όπως περικοπή, περιστροφή, μετασχηματισμός εικόνας κ.λπ. κάποιες πιο τεχνικές επεξεργασίας εικόνας αρέσει και στο τέλος του σεμιναρίου θα χτίσουμε ένα πρόγραμμα python-OpenCV να κάνει ζωντανή σκίτσο από την κάμερα ζωντανή τροφή. Αυτή η εφαρμογή θα χρησιμοποιεί πολλές από τις λειτουργίες επεξεργασίας εικόνας που έχουμε μάθει μέχρι τώρα ή θα μάθουμε σε αυτό το σεμινάριο, οπότε αυτό θα είναι ένα καλό πρακτικό παράδειγμα για την κάλυψη όλων των λειτουργιών.
Όπως αναφέρθηκε στο προηγούμενο σεμινάριο, το OpenCV είναι Open Source Commuter Vision Library που διαθέτει διεπαφές C ++, Python και Java και υποστηρίζει Windows, Linux, Mac OS, iOS και Android. Έτσι μπορεί να εγκατασταθεί εύκολα στο Raspberry Pi με περιβάλλον Python και Linux. Και το Raspberry Pi με OpenCV και συνδεδεμένη κάμερα μπορούν να χρησιμοποιηθούν για τη δημιουργία πολλών εφαρμογών επεξεργασίας εικόνας σε πραγματικό χρόνο, όπως Ανίχνευση προσώπου, κλείδωμα προσώπου, παρακολούθηση αντικειμένων, ανίχνευση πινακίδας αυτοκινήτου, σύστημα οικιακής ασφάλειας κ.λπ.
Σε αυτό το σεμινάριο, θα δούμε περισσότερους χειρισμούς εικόνων χρησιμοποιώντας το Python OpenCV. Εδώ θα μάθουμε να εφαρμόζουμε την ακόλουθη λειτουργία σε μια εικόνα χρησιμοποιώντας το Python OpenCV:
- Λειτουργίες και κάλυψη Bitwise
- Συνέλευση και θόλωση
- Sharpening - Αντιστροφή θολώματος της εικόνας
- Κατώφλι (Binarization)
- Διαστολή, διάβρωση, άνοιγμα / κλείσιμο
- Ανίχνευση άκρων και κλίσεις εικόνας
- Προοπτική & Μετασχηματισμός Affine
- Εφαρμογή Live Sketch
1. Λειτουργίες και κάλυψη Bitwise
Οι λειτουργίες Bitwise σας βοηθούν στην κάλυψη εικόνων και σας βοηθούν να δημιουργήσετε μερικές απλές εικόνες.
Κάνοντας ένα τετράγωνο
import cv2 import numpy ως np # χρησιμοποιούμε μόνο δύο διαστάσεις επειδή πρόκειται για μια εικόνα σε κλίμακα του γκρι, αν χρησιμοποιούσαμε μια # χρωματισμένη εικόνα, τότε είχαμε χρησιμοποιήσει ένα ορθογώνιο = np.zeros ((300,300,3), np.uint8) # Δημιουργία τετραγωνικού τετραγώνου = np.zeros ((300,300), np.uint8) cv2. ορθογώνιο (τετράγωνο, (50,50), (250,250), 255, -1) cv2.imshow ("τετράγωνο", τετράγωνο) cv2. waitKey (0)
Κάνοντας μια έλλειψη
έλλειψη = np.zeros ((300,300), np.uint8) cv2.ellipse (έλλειψη, (150,150), (150,150), 30,0,180,255, -1) cv2.imshow ("έλλειψη", έλλειψη) cv2.waitKey (0)
Πειραματισμός με λειτουργίες bitwise
#AND_ εμφανίζει μόνο εκεί όπου οι δύο τέμνονται
BitwiseAND = cv2.bitwise_and (τετράγωνο, έλλειψη) cv2.imshow ("AND", BitwiseAND) cv2.waitKey (0)
#OR_ εμφανίζει μόνο όπου βρίσκεται είτε τετράγωνο είτε έλλειψη
BitwiseOR = cv2.bitwise_or (τετράγωνο, έλλειψη) cv2.imshow ("OR", BitwiseOR) cv2.waitKey (0)
#XOR_ εμφανίζει μόνο όπου υπάρχει είτε από μόνο του
BitwiseXOR = cv2.bitwise_xor (τετράγωνο, έλλειψη) cv2.imshow ("XOR", BitwiseXOR) cv2.waitKey (0)
#NOT_ δείχνει ό, τι δεν είναι μέρος της έλλειψης και ΟΧΙ η λειτουργία μπορεί να εφαρμοστεί μόνο σε ένα σχήμα
BitwiseNOT_elp = cv2.bitwise_not (έλλειψη) cv2.imshow ("NOT_ellipse", BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. Συνέλευση & θόλωση
Μια συνέλιξη είναι μια μαθηματική λειτουργία που εκτελείται σε δύο συναρτήσεις που παράγουν μια τρίτη συνάρτηση η οποία είναι συνήθως μια τροποποιημένη έκδοση της αρχικής συνάρτησης.
Εικόνα εξόδου = εικόνα Λειτουργία Μέγεθος πυρήνα
Στην όραση του υπολογιστή χρησιμοποιούμε τον πυρήνα για να καθορίσουμε το μέγεθος πάνω από το οποίο εκτελούμε τη λειτουργία χειρισμού πάνω από την εικόνα μας.
Η θόλωση είναι μια λειτουργία όπου μέτρηση των εικονοστοιχείων σε μια περιοχή (Πυρήνας)
Το OpenCV θολώνει μια εικόνα εφαρμόζοντας πυρήνες, ένας πυρήνας σας λέει πώς να αλλάξετε την τιμή οποιουδήποτε δεδομένου εικονοστοιχείου συνδυάζοντάς το με διαφορετική ποσότητα γειτονικών εικονοστοιχείων, ο πυρήνας εφαρμόζεται σε κάθε εικονοστοιχείο στην εικόνα ένα προς ένα για να παράγει την τελική εικόνα.
Με απλά λόγια, μια συνελιγμένη εικόνα είναι απλώς ένας πολλαπλασιασμός στοιχείων δύο πινάκων που ακολουθείται από ένα άθροισμα.
Μπορούμε απλώς να το καταλάβουμε με το ακόλουθο παράδειγμα.
Τα παραπάνω είναι ένας πυρήνας 3Χ3.
Πολλαπλασιάζουμε με 1/25 για να ομαλοποιήσουμε, δηλαδή στο 1 είχαμε αυξήσει την ένταση ή μειώνοντας την ένταση, όπως στην περίπτωση της φωτεινότητας ή της σκοτεινότητας των εικόνων.
Ας δοκιμάσουμε ένα φίλτρο θολώματος opencv filter2D, που δίνεται από τη συνάρτηση cv2.filter2D (εικόνα, -1, πυρήνας)
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# δημιουργία ενός πίνακα πυρήνα 3x3
kernel_3x3 = np.ones ((3,3), np.float32) / 9
# χρησιμοποιούμε το cv2.filter2D για να περιστρέψουμε τον πυρήνα με μια εικόνα
θολή = cv2.filter2D (εικόνα, -1, kernel_3x3) cv2.imshow ('3x3_blurring', blur) cv2.waitKey (0)
# δημιουργία ενός πίνακα πυρήνα 7x7
kernel_7x7 = np.ones ((7,7), np.float32) / 49
# χρησιμοποιούμε το cv2.filter2D για να περιστρέψουμε τον πυρήνα με μια εικόνα
θολή = cv2.filter2D (εικόνα, -1, kernel_7x7) cv2.imshow ('7x7_blurring', blur) cv2.waitKey (0) cv2.destroyAllWindows ()
Υπάρχουν και άλλοι τύποι μεθόδων θόλωσης:
cv2.blur - Μέση τιμή πάνω από ένα καθορισμένο παράθυρο.
cv2.GaussianBlur - Παρόμοια αλλά χρησιμοποιεί ένα παράθυρο Gauss (μεγαλύτερη έμφαση σε σημεία γύρω από το κέντρο).
cv2.medianBlur - Χρησιμοποιεί διάμεσο όλων των στοιχείων στο παράθυρο.
cv2.bilateralFilter - Θολώνει ενώ διατηρεί τις άκρες αιχμηρές, διατηρεί τις άκρες και τις λεπτομέρειες της γραμμής.
Θα δούμε ένα προς ένα παρακάτω, πρώτα θα εμφανίσουμε την αρχική εικόνα χρησιμοποιώντας τον παρακάτω κώδικα:
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
cv2.blur:
Σε αυτήν τη μέθοδο, ο μέσος όρος γίνεται με τη σύγκλιση της εικόνας με ένα κανονικοποιημένο φίλτρο κουτιού, αυτό λαμβάνει χώρα κάτω από το πλαίσιο και αντικαθιστά το κεντρικό στοιχείο. Εδώ το μέγεθος του κουτιού πρέπει να είναι περίεργο και θετικό .
# cv2.blur blur = cv2.blur (image, (3,3)) cv2.imshow ('Averaging', blur) cv2.waitKey (0)
cv2.GussianBlur:
# cv2.GaussianBlur # αντί για φίλτρο κουτιού, ας δοκιμάσουμε τον Gaussian πυρήνα Gaussian = cv2.GussianBlur (εικόνα, (7,7), 0) cv2.imshow («Gaussian blurring», Gaussian )
cv2.medianBlur:
Χρειάζεται διάμεσος αριθμός όλων των pixel κάτω από την περιοχή του πυρήνα και το κεντρικό στοιχείο αντικαθίσταται με αυτήν τη μέση τιμή.
# cv2.medianBlur # λαμβάνει τη μέση τιμή όλων των εικονοστοιχείων κάτω από την περιοχή του πυρήνα και το κεντρικό στοιχείο # αντικαθίσταται με αυτήν τη μέση τιμή. διάμεση = cv2.medianBlur (εικόνα, 5) cv2.imshow ('διάμεσος θόλωμα', διάμεσος) cv2.waitKey (0)
cv2.bilateralFilter:
Το διμερές είναι πολύ αποτελεσματικό στην απομάκρυνση του θορύβου διατηρώντας ταυτόχρονα τις άκρες αιχμηρές
# cv2.bilateralFilter #Bilateral είναι πολύ αποτελεσματικό στην απομάκρυνση θορύβου, διατηρώντας παράλληλα τις άκρες αιχμηρές = cv2.bilateralFilter (εικόνα, 9,75,75) cv2.imshow («bilateral blurring», bilateral) cv2.waitKey (0) cv2. καταστροφή AllWindows ()
Image De-noising-non Local σημαίνει Denoising
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# παράμετρος μετά από Κανένα δεν είναι η ισχύς του φίλτρου 'h' (το 5-10 είναι μια καλή περιοχή) # το επόμενο είναι h για τα χρωματικά στοιχεία, ρυθμίστε την ίδια τιμή με το h ξανά
dst = cv2.fastNlMeansDenoisingColored (image, None, 6,6,7,21) cv2.imshow («Fast σημαίνει denois», dst) cv2.waitKey (0) cv2.destroyAllWindows ()
Υπάρχουν 4 παραλλαγές μη τοπικών μέσων
cv2.fastNlMeansDenoising () - για μονή γκρι κλίμακα εικόνας
cv2.fastNlMeansDenoisingColored () - Ενιαία έγχρωμη εικόνα
cv2.fastNlmeansDenoisingMulti () - για γκρι κλίμακα ακολουθίας εικόνας
cv2.fastNlmeansDenoisingcoloredMulti () - για χρωματική ακολουθία εικόνας
3. Sharpening - Αντιστροφή θολώνει την εικόνα
Το ακόνισμα είναι το αντίθετο του θολώματος, ενισχύει ή δίνει έμφαση στα άκρα της εικόνας.
Πυρήνας =,,
Η μήτρα του πυρήνα μας συνοψίζει έως ένα, οπότε δεν χρειάζεται να ομαλοποιηθεί (δηλαδή πολλαπλασιάζεται με έναν παράγοντα στην ίδια φωτεινότητα με το αρχικό), εάν ο πυρήνας δεν έχει κανονικοποιηθεί σε 1, η εικόνα θα ήταν φωτεινότερη ή πιο σκοτεινή.
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
kernel_sharpening = np.array (,
])
#εφαρμογή ακονίσματος πυρήνα για εισαγωγή εικόνας
sharpened = cv2.filter2D (image, -1, kernel_sharpening) cv2.imshow ('sharpened image', sharpened) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Threshoding (Binarization)
Το κατώφλι είναι πράξη μετατροπής μιας εικόνας σε δυαδική μορφή. Στο opencv υπάρχει ξεχωριστή συνάρτηση για κατώφλι που ορίζεται ως
Cv2.threshold (εικόνα, τιμή κατωφλίου, Μέγιστη τιμή, τύπος κατωφλίου)
Υπάρχουν οι ακόλουθοι τύποι κατωφλίου:
- cv2.THRESH_BINARY - πιο συνηθισμένο
- cv2. THRESH_BINARY_INV - πιο συνηθισμένο
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2. THRESH_TOZERO_INV
ΣΗΜΕΙΩΣΗ: η εικόνα πρέπει να μετατραπεί σε κλίμακα του γκρι πριν από το κατώφλι
εισαγωγή cv2 εισαγωγή numpy ως np #load image as grayscale image = cv2.imread ('gradient.jpg', 0) cv2.imshow ('original', image) cv2.waitKey (0)
# τιμή κάτω από 127 πηγαίνετε στο 0 (μαύρο) και πάνω από 127 πηγαίνετε στο 255 (λευκό)
_, thresh1 = cv2.threshold (εικόνα, 127,255, cv2.THRESH_BINARY) cv2.imshow ('1 threshold', thresh1) cv2.waitKey (0)
# η τιμή κάτω από το 127 πηγαίνει στο 255 και οι τιμές πάνω από το 127 πηγαίνει στο 0 (αντίστροφη από πάνω)
_, thresh2 = cv2.threshold (εικόνα, 127,255, cv2.THRESH_BINARY_INV) cv2.imshow ('2 threshold', thresh2) cv2.waitKey (0)
# τιμή άνω των 127 περικόπτεται (διατηρείται) στο 127, το όρισμα 255 δεν χρησιμοποιείται.
_, thresh3 = cv2.threshold (εικόνα, 127,255, cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc ', thresh3) cv2.waitKey (0)
# τιμές κάτω από 127 πηγαίνει στο 0, πάνω από 127 είναι αμετάβλητες
_, thresh4 = cv2.threshold (εικόνα, 127,255, cv2.THRESH_TOZERO) cv2.imshow ('4 threshold', thresh4) cv2.waitKey (0)
#Revesrse παραπάνω, κάτω από το 127 είναι αμετάβλητο, πάνω από το 127 πηγαίνει στο μηδέν
_, thresh5 = cv2.threshold (εικόνα, 127,255, cv2.THRESH_TOZERO_INV) cv2.imshow ('5 threshold', thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Διαστολή, διάβρωση, άνοιγμα / κλείσιμο
Αυτές είναι οι πράξεις στον τομέα της μαθηματικής μορφολογίας
Διαστολή - προσθέτει pixel στα όρια του αντικειμένου σε μια εικόνα.
Erosion - Αφαιρεί pixel στα όρια του αντικειμένου σε μια εικόνα.
Άνοιγμα - Διάβρωση ακολουθούμενη από διαστολή.
Κλείσιμο - Διαστολή μετά από διάβρωση.
Το άνοιγμα είναι πολύ χρήσιμο στη μετουσίωση των εικόνων καθώς πρώτα αραιώνει την εικόνα από τη διάβρωση (αφαιρεί το θόρυβο) και στη συνέχεια την διαχέει.
Σύγχυση με διαστολή και διάβρωση
Υπάρχει μερικές φορές σύγχυση μεταξύ διαστολής και διάβρωσης συνήθως σε εικόνες με λευκό φόντο, καθώς το opencv θεωρεί ότι το λευκό φόντο ως εικόνα πρέπει να διασταλεί ή να διαβρωθεί αντί της αρχικής εικόνας, οπότε στην περίπτωση αυτή η διάβρωση λειτουργεί ως διαστολή και το αντίστροφο, όπως φαίνεται στο δείγμα Φαίνεται παρακάτω.
Θυμηθείτε, η διαστολή προσθέτει pixel στα όρια των αντικειμένων σε μια εικόνα ενώ η Erosion αφαιρεί τα pixel στα όρια των αντικειμένων σε μια εικόνα
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('imagecv.png', 0) cv2.imshow ('original', image) cv2.waitKey (0)
#Erosion
# ας καθορίσουμε το μέγεθος του πυρήνα μας
πυρήνας = np.ones ((5,5), np.uint8)
# Τώρα διαβρώνουμε την εικόνα, εδώ η επανάληψη δεν είναι φορές που θέλετε να διαβρώσετε την εικόνα
erosion = cv2.erode (εικόνα, πυρήνας, επαναλήψεις = 1) cv2.imshow («Διάβρωση», διάβρωση) cv2.waitKey (0)
#διαστολή
διαστολή = cv2.dilate (εικόνα, πυρήνας, επαναλήψεις = 1) cv2.imshow («διαστολή», διαστολή) cv2.waitKey (0)
# άνοιγμα, Καλό για την αφαίρεση του θορύβου
άνοιγμα = cv2.morphologyEx (εικόνα, cv2.MORPH_OPEN, πυρήνας) cv2.imshow («άνοιγμα», άνοιγμα) cv2.waitKey (0)
# κλείσιμο, καλό για την αφαίρεση θορύβου
κλείσιμο = cv2.morphologyEx (εικόνα, cv2.MORPH_CLOSE, πυρήνας) cv2.imshow («κλείσιμο», κλείσιμο) cv2.waitKey (0) cv2.destroyAllWindows ()
6. Ανίχνευση άκρων και κλίσεις εικόνας
Η ανίχνευση άκρων είναι πολύ σημαντική περιοχή στην όραση του υπολογιστή, ειδικά όταν ασχολείστε με τα περιγράμματα.
Τα άκρα μπορούν να οριστούν ως όρια της εικόνας, στην πραγματικότητα είναι άκρα που ορίζουν το αντικείμενο σε εικόνες που διατηρούν πολλές πληροφορίες σχετικά με την εικόνα.
Τυπικά τα Edges μπορούν να οριστούν ως ξαφνικές αλλαγές (ασυνέχειες) σε μια εικόνα και μπορούν να κωδικοποιήσουν όσες πληροφορίες είναι τα pixel.
Η παραπάνω εικόνα δείχνει πώς το όραμα του υπολογιστή αναγνωρίζει και αναγνωρίζει την εικόνα.
Αλγόριθμοι ανίχνευσης ακμών : - Υπάρχουν τρεις κύριοι τύποι αλγορίθμων ανίχνευσης ακμών
- Sobel - για έμφαση σε κάθετες ή οριζόντιες εικόνες.
- Laplacian - βέλτιστο λόγω χαμηλού ποσοστού σφάλματος, καλά καθορισμένων άκρων και ακριβούς εντοπισμού.
- Αλγόριθμος ανίχνευσης Canny Edge (εκχωρήθηκε από τον john.F.Canny το 1986)
1. Εφαρμόζει το Gaussian blur
2. Εντοπίζει την κλίση έντασης της εικόνας
3. εφαρμόζει μη μέγιστη καταστολή (δηλαδή αφαιρεί pixel που δεν είναι άκρα).
4. Η υστέρηση εφαρμόζει κατώφλι (δηλ. Εάν το εικονοστοιχείο βρίσκεται εντός του άνω και κατώτατου ορίου, θεωρείται ως άκρο)
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('input.jpg', 0) ύψος, πλάτος = image.shape
#sobel
# εξόρυξη άκρων
sobel_x = cv2.Sobel (εικόνα, cv2.CV_64F, 0,1, ksize = 5) sobel_y = cv2.Sobel (εικόνα, cv2.CV_64F, 1,0, ksize = 5) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('sobelx', sobel_x) cv2.waitKey (0)
# Σοβαρά
cv2.imshow ('sobely', sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x, sobel_y) cv2.imshow ('sobelOR', sobel_OR) cv2.waitKey (0)
# λαπλάια
laplacian = cv2.Laplacian (εικόνα, cv2.CV_64F) cv2.imshow («Laplacian», laplacian) cv2.waitKey (0)
Ο αλγόριθμος ανίχνευσης ακμής #canny χρησιμοποιεί τιμές διαβάθμισης ως κατώτατα
όρια.
# κάθε κλίση μεγαλύτερη από το όριο 2 θεωρείται άκρη.
# κάθε κλίση μεγαλύτερη από το κατώφλι 1 θεωρείται ότι δεν είναι άκρη.
#values μεταξύ κατωφλίου 1 και όριο 2 είναι είτε ως ακμή ή μη ακμή
#on πώς οι εντάσεις τους συνδέονται, σε αυτή την περίπτωση οποιαδήποτε τιμή κάτω από 60 είναι θεωρούνται
#non ακμές wheareas οποιαδήποτε τιμή πάνω από 120 θεωρούνται ως ακμές.
canny = cv2.Canny (εικόνα, 60,120) cv2.imshow («canny», canny ) cv2.waitKey (0) cv2.destroyAllWindows ()
14. Προοπτική και συναισθηματικός μετασχηματισμός
Ας κάνουμε ένα βήμα πίσω και να ρίξουμε μια ματιά σε μετασχηματισμούς συγγενών και μη συγγενών, η αρχική εικόνα που φαίνεται παρακάτω είναι σαφώς μια μη συγγενή εικόνα καθώς οι άκρες πρόκειται να συναντηθούν σε κάποιο σημείο, ωστόσο, μπορούμε να την ισιώσουμε στρεβλώνοντας και λαμβάνοντας την προοπτική μεταμορφώνω.
Για αυτόν τον μετασχηματισμό προοπτικής χρειαζόμαστε τις τέσσερις συντεταγμένες της αρχικής εικόνας και στη συνέχεια τα τέσσερα σημεία της εικόνας εξόδου, υποδηλώνονται με σημεία_Α και σημεία_Β. Πρώτον, με τη βοήθεια αυτών των σημείων υπολογίζουμε έναν πίνακα μετασχηματισμού, M με τη βοήθεια της συνάρτησης getPerspectiveTransform.
Και έπειτα αυτός ο πίνακας δίνεται στη συνάρτηση warpPerspective για να δημιουργήσει το τελικό αποτέλεσμα.
Τώρα ας δοκιμάσουμε πρώτα τον μετασχηματισμό προοπτικής.
εισαγωγή cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('paper.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# συντεταγμένη 4 γωνιών της αρχικής εικόνας
points_A = np.float32 (,,,])
# συντεταγμένες 4 γωνιών της επιθυμητής εξόδου
# χρησιμοποιούμε αναλογία χαρτιού Α4 1: 1,41
βαθμοί_Β = np.float32 (,,,])
# χρησιμοποιήστε τα δύο σύνολα δύο σημείων για να υπολογίσετε την προοπτική μήτρα μετασχηματισμού, M
M = cv2.getPerspectiveTransform (points_A, points_B) warped = cv2.warpPerspective (image, M, (420,594)) cv2.imshow ('warpprespective', warped ) cv2.waitKey (0) cv2.destroyAllWindows ()
Ο μετασχηματισμός Affine είναι ευκολότερος από τον μη συσχετισμένο μετασχηματισμό καθώς χρειαζόμαστε μόνο τρεις βαθμούς για να πάρουμε τη μετατροπή. Ολόκληρη η διαδικασία πηγαίνει το ίδιο, αλλά αντί του μετασχηματισμού προοπτικής έχουμε τώρα μετασχηματισμό συγγενών και επίσης ορίζουμε cols και σειρές στο warpAffine από τη λειτουργία σχήματος αντί να το εισάγουμε χειροκίνητα.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('box.jpg') σειρές, cols = image.shape cv2.imshow ('original', image) cv2.waitKey (0)
# συντεταγμένη 3 γωνιών της αρχικής εικόνας
points_A = np.float32 (,,])
# συντεταγμένες 3 γωνιών της επιθυμητής εξόδου
# χρησιμοποιούμε αναλογία χαρτιού Α4 1: 1,41
points_B = np.float32 (,,])
# χρησιμοποιήστε τα δύο σύνολα δύο σημείων για να υπολογίσετε τον πίνακα μετασχηματισμού Affine
#
M = cv2.getAffineTransform (points_A, points_B) warped = cv2.warpAffine (image, M, (cols, rows)) cv2.imshow ('warpaffine', warped ) cv2.waitKey (0) cv2.destroyAllWindows ()
8. Εφαρμογή Live Sketch
Πρώτα απ 'όλα, συγχαίρετε τον εαυτό σας ότι έχετε κάνει αυτό το μίνι έργο αφού διαβάσετε όλες τις παραπάνω λειτουργίες χειρισμού εικόνας. Έτσι σε αυτό το μίνι έργο του Python OpenCV πρόκειται να μάθουμε μερικές νέες έννοιες των βρόχων και των λειτουργιών. Εάν είστε εξοικειωμένοι με τον προγραμματισμό, πρέπει να έχετε μια ευρύτερη ιδέα για τη λειτουργία και τους βρόχους. Ωστόσο, στον πύθωνα η βασική έννοια των βρόχων και των λειτουργιών παραμένει η ίδια, αλλά η μέθοδος για τον ορισμό τους αλλάζει λίγο.
Έτσι, στην αρχή αυτού του προγράμματος μπορούμε να δούμε μια συγκεκριμένη ομάδα δηλώσεων με τίτλο « def sketch (εικόνα): » αυτός είναι ένας επίσημος ορισμός μιας συνάρτησης μιας ομάδας δηλώσεων που συνεργάζονται για μια συγκεκριμένη έξοδο.
Έτσι, αυτό το σκίτσο είναι μια συνάρτηση, στη συνάρτηση python ορίζεται από το "def" και τελειώνει με το σύμβολο ":". Επίσης, οι δηλώσεις που πρέπει να βρίσκονται μέσα στη συνάρτηση ή μπορείτε να πείτε ποιες είναι απαραίτητες για τη σωστή λειτουργία της συνάρτησης, ευθυγραμμίζονται αυτόματα από τη συνάρτηση. Έτσι, για να βγείτε από τις συναρτήσεις, οι δηλώσεις έπρεπε να είναι πλήρως αριστερές. Για τις περαιτέρω αναφορές μπορείτε να ανατρέξετε στο google σχετικά με τον τρόπο καθορισμού των λειτουργιών στο python.
Έτσι, σε αυτήν τη λειτουργία σκίτσων έχουμε εισαγάγει πολλά επίπεδα επεξεργασίας εικόνας που συνδυάζονται για να δώσουν έξοδο. Πρώτον, η εικόνα μετατρέπεται σε κλίμακα του γκρι, έτσι ώστε το opencv να μπορεί να το επεξεργαστεί εύκολα και στη συνέχεια εφαρμόζεται ένα θάμπωμα Gauss στη γκρι κλίμακα της εικόνας ώστε να μειωθεί ο θόρυβος. Στη συνέχεια, οι άκρες εξάγονται με τη βοήθεια του αλγορίθμου ανίχνευσης άκρων του καμβά και στη συνέχεια εφαρμόζεται ένα δυαδικό αντίστροφο στην εικόνα που ορίζεται στην άκρη, εδώ το δυαδικό αντίστροφο θα μπορούσε επίσης να γίνει με bitwise_NOT, αλλά είχαμε επιλέξει σκόπιμα αυτό το κατώφλι δυαδικό αντίστροφο καθώς δίνει ελευθερία για να ορίσει τις παραμέτρους του έως ότου λάβουμε μια καθαρή εικόνα.
Πρέπει επίσης να σημειωθεί ότι η συνάρτηση λαμβάνει την εικόνα των ορισμάτων και επιστρέφει τα δύο ορίσματα ret και mask. Ενώ το ret είναι το Boolean που λέει ότι η λειτουργία εκτελείται με επιτυχία ή όχι και η μάσκα είναι η τελική έξοδος της συνάρτησης, δηλαδή η επεξεργασμένη εικόνα.
Στη συνέχεια, η δεύτερη ιδέα είναι η λειτουργία κάμερας στο opencv που γίνεται από τη συνάρτηση cv2.VideoCapture (0) , η οποία αποθηκεύει την εικόνα σε ένα καπάκι αντικειμένου το οποίο μπορεί να διαβαστεί το καπάκι με τη λειτουργία cap.read () , επίσης εδώ για να σημειωθεί αυτό το καπάκι. Η ανάγνωση () βρίσκεται μέσα στο άπειρο βρόχο, καθώς έπρεπε συνεχώς να τραβάει τις εικόνες, για να δώσει μια αίσθηση ενός ζωντανού βίντεο, όπου ο ρυθμός καρέ του βίντεο θα είναι ο ρυθμός καρέ της κάμερας web που κυμαίνεται κυρίως μεταξύ 24 και 60 fps.
Το cap.read () επιστρέφει ret και frame, όπου το ret είναι το Boolean που δείχνει ότι η λειτουργία εκτελέστηκε με επιτυχία ή όχι και το πλαίσιο περιέχει την εικόνα που τραβήχτηκε από την κάμερα web.
Ακολουθεί ο πλήρης κωδικός Python OpenCV για την εκτέλεση του Live Sketch
import cv2 import numpy as np #sketch generator function def sketch (image): #convert image to grayscale img_gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # καθαρισμός της εικόνας χρησιμοποιώντας Gaussian blur img_gray_blur = cv2.Ga (cv2.Ga 5,5), 0) #xtract edges canny_edges = cv2.Canny (img_gray_blur, 10,70) #do a invert binarize the image ret, mask = cv2.threshold (canny_edges, 70,255, cv2.THRESH_BINARY_INV) μάσκα επιστροφής # αρχικοποίηση κάμερας web, cap είναι το αντικείμενο που παρέχεται από την καταγραφή βίντεο #it περιέχει Boolean που δείχνει εάν ήταν επιτυχές (ret) Το #it περιέχει επίσης τις εικόνες που συλλέγονται από την κάμερα web (καρέ) καπάκι = cv2.VideoCapture (0) ενώ True: ret, frame = cap.read () cv2.imshow ('livesketcher', sketch (frame)) εάν cv2.waitKey (1) == 13: # 13 είναι το enterkey break #release camera και κλείσιμο παραθύρου, θυμηθείτε να απελευθερώσετε την κάμερα web με τη βοήθεια του cap.release () cap.release () cv2.destroyAllWindows ()
Αυτό είναι λοιπόν το τέλος του μέρους 2 των χειρισμών εικόνας στο Python-OpenCV. Για να έχετε καλή κατανόηση της όρασης του υπολογιστή και του OpenCV, διαβάστε προηγούμενα άρθρα (Ξεκινώντας με το Python OpenCV και το Manipulations Image στο Python OpenCV (Μέρος 1) και θα μπορείτε να κάνετε κάτι εντυπωσιακό με το Computer Vision.