OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

OpenCV Thresholding στην Python με cv2.threshold()

Εισαγωγή

Το κατώφλι είναι μια απλή και αποτελεσματική τεχνική για την εκτέλεση βασικής τμηματοποίησης σε μια εικόνα και για τη δυαδοποίηση της (μετατροπή της σε δυαδική εικόνα) όπου τα εικονοστοιχεία είναι είτε 0 or 1255 εάν χρησιμοποιείτε ακέραιους αριθμούς για να τους αναπαραστήσετε).

Συνήθως, μπορείτε να χρησιμοποιήσετε το όριο για να εκτελέσετε απλή τμηματοποίηση φόντου-προσκηνίου σε μια εικόνα και συνοψίζεται σε παραλλαγές σε μια απλή τεχνική για κάθε pixel:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Αυτή η ουσιαστική διαδικασία είναι γνωστή ως Δυαδικό κατώφλι. Τώρα – υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να τροποποιήσετε αυτή τη γενική ιδέα, συμπεριλαμβανομένης της αντιστροφής των λειτουργιών (εναλλαγή του > υπογράψτε με α < σημάδι), ορίζοντας το pixel_value στο threshold αντί για μέγιστη τιμή/0 (γνωστή ως περικοπή), διατηρώντας το pixel_value η ίδια αν είναι πάνω από το threshold ή αν είναι κάτω από το threshold.

Όλα αυτά έχουν εφαρμοστεί εύκολα στο OpenCV ως:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

… αντίστοιχα. Αυτές είναι σχετικά «αφελείς» μέθοδοι, καθώς είναι αρκετά απλές, δεν λαμβάνουν υπόψη το πλαίσιο στις εικόνες, γνωρίζουν ποια είναι τα κοινά σχήματα κ.λπ. Για αυτές τις ιδιότητες – θα έπρεπε να χρησιμοποιήσουμε πολύ πιο ακριβά και ισχυρά υπολογιστικά τεχνικές.

Τώρα, ακόμα και με τις «αφελείς» μεθόδους – μερικοί μπορούν να τεθούν σε εφαρμογή ευρετικές τεχνικές, για την εύρεση καλών ορίων, και αυτές περιλαμβάνουν τη μέθοδο Otsu και τη μέθοδο του Τριγώνου:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

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

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

Απλός καθορισμός κατωφλίου με OpenCV

Το Thresholding στο Python API του OpenCV γίνεται μέσω του cv2.threshold() μέθοδος – η οποία δέχεται μια εικόνα (πίνακας NumPy, που αναπαρίσταται με ακέραιους αριθμούς), το κατώφλι, τη μέγιστη τιμή και τη μέθοδο κατωφλίου (πώς threshold και maximum_value είναι μεταχειρισμένα):

img = cv2.imread('objects.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

Ο κωδικός επιστροφής είναι μόνο το εφαρμοσμένο όριο:

print(f"Threshold: {ret}") 

Εδώ, αφού το κατώφλι είναι 220 και χρησιμοποιήσαμε το THRESH_BINARY μέθοδος – κάθε τιμή pixel παραπάνω 220 θα αυξηθεί σε 255, ενώ κάθε τιμή pixel παρακάτω 220 θα μειωθεί σε 0, δημιουργώντας μια ασπρόμαυρη εικόνα, με μια «μάσκα», που καλύπτει τα αντικείμενα του προσκηνίου.

Γιατί 220; Η γνώση της εμφάνισης της εικόνας σάς επιτρέπει να κάνετε μερικές κατά προσέγγιση εικασίες σχετικά με το όριο που μπορείτε να επιλέξετε. Στην πράξη, σπάνια θα θέλετε να ορίσετε ένα μη αυτόματο όριο και θα καλύψουμε την αυτόματη επιλογή ορίου σε λίγο.

Ας σχεδιάσουμε το αποτέλεσμα! Τα παράθυρα OpenCV μπορεί να είναι λίγο δύσκολα, επομένως θα σχεδιάσουμε την αρχική εικόνα, τη θολή εικόνα και τα αποτελέσματα χρησιμοποιώντας το Matplotlib:

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

Μέθοδοι Οριοθέτησης

Όπως αναφέρθηκε προηγουμένως, υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να χρησιμοποιήσετε το όριο και τη μέγιστη τιμή σε μια συνάρτηση. Αρχικά ρίξαμε μια ματιά στο δυαδικό όριο. Ας δημιουργήσουμε μια λίστα μεθόδων και ας τις εφαρμόσουμε μία προς μία, σχεδιάζοντας τα αποτελέσματα:

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARY και THRESH_BINARY_INV είναι αντίστροφα μεταξύ τους και δυαδοποιούν μια εικόνα μεταξύ τους 0 και 255, αναθέτοντάς τους στο παρασκήνιο και στο προσκήνιο αντίστοιχα, και αντίστροφα.

THRESH_TRUNC δυαδοποιεί την εικόνα μεταξύ threshold και 255.

THRESH_TOZERO και THRESH_TOZERO_INV δυαδοποίηση μεταξύ 0 και την τρέχουσα τιμή pixel (src(x, y)). Ας ρίξουμε μια ματιά στις εικόνες που προέκυψαν:

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Αυτές οι μέθοδοι είναι αρκετά διαισθητικές – αλλά, πώς μπορούμε να αυτοματοποιήσουμε μια καλή τιμή κατωφλίου και τι σημαίνει ακόμη μια τιμή «καλού κατωφλίου»; Τα περισσότερα από τα αποτελέσματα μέχρι στιγμής είχαν μη ιδανικές μάσκες, με σημάδια και κηλίδες μέσα τους. Αυτό συμβαίνει λόγω της διαφοράς στις ανακλαστικές επιφάνειες των νομισμάτων – δεν είναι ομοιόμορφα χρωματισμένα λόγω της διαφοράς στον τρόπο με τον οποίο οι κορυφογραμμές αντανακλούν το φως.

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

Αυτόματο/Βελτιστοποιημένο κατώτατο όριο με OpenCV

Το OpenCV χρησιμοποιεί δύο αποτελεσματικές μεθόδους παγκόσμιας αναζήτησης κατωφλίου – τη μέθοδο του Otsu και τη μέθοδο Triangle.

Η μέθοδος του Otsu υποθέτει ότι λειτουργεί διτροπικό εικόνες. Οι διτροπικές εικόνες είναι εικόνες των οποίων τα έγχρωμα ιστογράμματα περιέχουν μόνο δύο κορυφές (δηλαδή έχουν μόνο δύο διακριτές τιμές pixel). Λαμβάνοντας υπόψη ότι η καθεμία από τις κορυφές ανήκει σε μια κατηγορία όπως το "φόντο" και το "πρώτο πλάνο" - το ιδανικό κατώφλι βρίσκεται ακριβώς στη μέση τους.

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Πιστωτικά Εικόνα: https://scipy-lectures.org/

Μπορείτε να κάνετε ορισμένες εικόνες πιο διτροπικές με γκαουσιανές θαμπάδες, αλλά όχι όλες.

Ένας εναλλακτικός αλγόριθμος που πολλές φορές έχει καλύτερη απόδοση είναι ο αλγόριθμος του τριγώνου, ο οποίος υπολογίζει την απόσταση μεταξύ του μέγιστου και του ελάχιστου του ιστογράμματος σε επίπεδο γκρι και χαράσσει μια γραμμή. Ως κατώφλι επιλέγεται το σημείο στο οποίο αυτή η γραμμή βρίσκεται σε μέγιστη απόσταση από το υπόλοιπο ιστόγραμμα:

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Και τα δύο προϋποθέτουν μια εικόνα σε κλίμακα του γκρι, επομένως θα χρειαστεί να μετατρέψουμε την εικόνα εισόδου σε γκρι μέσω cv2.cvtColor():

img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

Ας εκτελέσουμε την εικόνα και με τις δύο μεθόδους και ας οπτικοποιήσουμε τα αποτελέσματα:

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Εδώ, η μέθοδος του τριγώνου υπερτερεί της μεθόδου του Otsu, επειδή η εικόνα δεν είναι διτροπική:

import numpy as np

img = cv2.imread('coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ωστόσο, είναι ξεκάθαρο πώς η μέθοδος του τριγώνου μπόρεσε να λειτουργήσει με την εικόνα και να παράγει ένα πιο ικανοποιητικό αποτέλεσμα.

Περιορισμοί του κατωφλίου OpenCV

Το thresholding με το OpenCV είναι απλό, εύκολο και αποτελεσματικό. Ωστόσο, είναι αρκετά περιορισμένο. Μόλις εισάγετε πολύχρωμα στοιχεία, ανομοιόμορφο φόντο και μεταβαλλόμενες συνθήκες φωτισμού – το συνολικό κατώφλι ως έννοια γίνεται πολύ άκαμπτο.

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

Συμπέρασμα

Τα τελευταία χρόνια, η δυαδική τμηματοποίηση (όπως κάναμε εδώ) και η τμηματοποίηση πολλαπλών ετικετών (όπου μπορείτε να κωδικοποιήσετε έναν αυθαίρετο αριθμό κλάσεων) έχει μοντελοποιηθεί με επιτυχία με δίκτυα βαθιάς εκμάθησης, τα οποία είναι πολύ πιο ισχυρά και ευέλικτα. Επιπλέον, μπορούν να κωδικοποιήσουν παγκόσμιο και τοπικό πλαίσιο στις εικόνες που τμηματοποιούν. Το μειονέκτημα είναι ότι χρειάζεστε δεδομένα για να τους εκπαιδεύσετε, καθώς και χρόνο και εξειδίκευση.

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

Going Further – Πρακτική βαθιά μάθηση για το Computer Vision

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Πορεία: "Πρακτική βαθιά μάθηση για την όραση υπολογιστή με Python".

OpenCV Thresholding σε Python με cv2.threshold() PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ένα άλλο μάθημα Computer Vision;

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

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

Τι είναι μέσα?

  • Οι πρώτες αρχές της όρασης και πώς οι υπολογιστές μπορούν να διδαχθούν να «βλέπουν»
  • Διαφορετικές εργασίες και εφαρμογές της όρασης υπολογιστή
  • Τα εργαλεία του εμπορίου που θα κάνουν τη δουλειά σας πιο εύκολη
  • Εύρεση, δημιουργία και χρήση συνόλων δεδομένων για την όραση υπολογιστή
  • Η θεωρία και η εφαρμογή των συνελικτικών νευρωνικών δικτύων
  • Χειρισμός μετατόπισης τομέα, συνεμφάνισης και άλλων προκαταλήψεων στα σύνολα δεδομένων
  • Μεταφέρετε τη μάθηση και χρησιμοποιείτε τον χρόνο εκπαίδευσης και τους υπολογιστικούς πόρους άλλων προς όφελός σας
  • Κατασκευή και εκπαίδευση ενός υπερσύγχρονου ταξινομητή καρκίνου του μαστού
  • Πώς να εφαρμόσετε μια υγιή δόση σκεπτικισμού στις επικρατούσες ιδέες και να κατανοήσετε τις επιπτώσεις των ευρέως υιοθετημένων τεχνικών
  • Οπτικοποίηση του «εννοιολογικού χώρου» ενός ConvNet χρησιμοποιώντας t-SNE και PCA
  • Μελέτες περίπτωσης για το πώς οι εταιρείες χρησιμοποιούν τεχνικές όρασης υπολογιστή για να επιτύχουν καλύτερα αποτελέσματα
  • Σωστή αξιολόγηση μοντέλου, οπτικοποίηση λανθάνοντος χώρου και αναγνώριση της προσοχής του μοντέλου
  • Εκτέλεση έρευνας τομέα, επεξεργασία των δικών σας συνόλων δεδομένων και δημιουργία δοκιμών μοντέλων
  • Αρχιτεκτονικές αιχμής, η εξέλιξη των ιδεών, τι τις κάνει μοναδικές και πώς να τις εφαρμόσετε
  • KerasCV – μια βιβλιοθήκη WIP για τη δημιουργία αγωγών και μοντέλων τελευταίας τεχνολογίας
  • Πώς να αναλύετε και να διαβάζετε έγγραφα και να τα εφαρμόζετε μόνοι σας
  • Επιλογή μοντέλων ανάλογα με την εφαρμογή σας
  • Δημιουργία ενός αγωγού μηχανικής εκμάθησης από άκρο σε άκρο
  • Τοπίο και διαίσθηση για την ανίχνευση αντικειμένων με ταχύτερα R-CNN, RetinaNets, SSD και YOLO
  • Παρουσίαση και σημασιολογική κατάτμηση
  • Αναγνώριση αντικειμένων σε πραγματικό χρόνο με το YOLOv5
  • Εκπαίδευση ανιχνευτών αντικειμένων YOLOv5
  • Εργασία με μετασχηματιστές χρησιμοποιώντας KerasNLP (βιβλιοθήκη WIP με αντοχή στη βιομηχανία)
  • Ενσωμάτωση Transformers με ConvNets για τη δημιουργία λεζάντων εικόνων
  • DeepDream
  • Βελτιστοποίηση μοντέλου Deep Learning για όραση υπολογιστή

Σφραγίδα ώρας:

Περισσότερα από Stackabuse