OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

OpenCV-Schwellenwert in Python mit cv2.threshold()

Einleitung

Die Schwellenwertbildung ist eine einfache und effiziente Technik, um eine grundlegende Segmentierung in einem Bild durchzuführen und es zu binarisieren (in ein binäres Bild umzuwandeln), wo sich Pixel befinden 0 or 1 (oder 255 wenn Sie ganze Zahlen verwenden, um sie darzustellen).

Typischerweise können Sie Schwellenwerte verwenden, um eine einfache Hintergrund-Vordergrund-Segmentierung in einem Bild durchzuführen, und es läuft auf Varianten einer einfachen Technik für jedes Pixel hinaus:

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

Dieser wesentliche Prozess ist bekannt als Binärer Schwellenwert. Nun – es gibt verschiedene Möglichkeiten, wie Sie diese allgemeine Idee optimieren können, einschließlich der Umkehrung der Operationen (Umschalten der > mit a unterschreiben < Zeichen), Einstellung der pixel_value zu den threshold Anstelle eines maximalen Werts/0 (bekannt als Abschneiden), das Beibehalten der pixel_value selbst, wenn es über dem ist threshold oder wenn es unter dem ist threshold.

All dies wurde bequem in OpenCV implementiert als:

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

… beziehungsweise. Dies sind relativ „naive“ Methoden, da sie ziemlich einfach sind, den Kontext in Bildern nicht berücksichtigen, wissen, welche Formen üblich sind usw. Für diese Eigenschaften müssten wir viel rechenintensivere und leistungsfähigere Verfahren einsetzen Techniken.

Nun, selbst mit den „naiven“ Methoden – einige Heuristiken können eingesetzt werden, um gute Schwellenwerte zu finden, und dazu gehören die Otsu-Methode und die Triangle-Methode:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Hinweis: OpenCV-Schwellenwertbildung ist eine rudimentäre Technik und reagiert empfindlich auf Beleuchtungsänderungen und Farbverläufe, Farbheterogenität usw. Sie wird am besten auf relativ saubere Bilder angewendet, nachdem sie zur Reduzierung von Rauschen verwischt wurden, ohne große Farbabweichungen in den Objekten, die Sie segmentieren möchten.

Eine andere Möglichkeit, einige der Probleme mit der einfachen Schwellenwertbildung mit einem einzigen Schwellenwert zu überwinden, ist die Verwendung adaptive Schwellenbildung die einen Schwellenwert auf jeden kleinen Bereich in einem Bild anwendet, anstatt global.

Einfaches Thresholding mit OpenCV

Die Schwellenwertbildung in der Python-API von OpenCV erfolgt über die cv2.threshold() Methode – die ein Bild akzeptiert (NumPy-Array, dargestellt durch Ganzzahlen), den Schwellenwert, den Maximalwert und die Schwellenwertmethode (wie die threshold und maximum_value werden verwendet):

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)

Der Rückgabecode ist nur der angewendete Schwellenwert:

print(f"Threshold: {ret}") 

Hier, da die Schwelle ist 220 und wir haben die verwendet THRESH_BINARY Methode – jeder Pixelwert oben 220 wird erhöht auf 255, während jeder Pixelwert unten 220 wird abgesenkt 0, indem ein Schwarz-Weiß-Bild mit einer „Maske“ erstellt wird, die die Vordergrundobjekte bedeckt.

Warum 220? Wenn Sie wissen, wie das Bild aussieht, können Sie ungefähre Vermutungen darüber anstellen, welchen Schwellenwert Sie wählen können. In der Praxis werden Sie selten einen manuellen Schwellenwert festlegen wollen, und wir werden uns gleich mit der automatischen Schwellenwertauswahl befassen.

Zeichnen wir das Ergebnis! OpenCV-Fenster können etwas knifflig sein, also plotten wir das Originalbild, das unscharfe Bild und die Ergebnisse mit Matplotlib:

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

Schwellenwertmethoden

Wie bereits erwähnt, gibt es verschiedene Möglichkeiten, den Schwellenwert und den Maximalwert in einer Funktion zu verwenden. Wir haben uns zunächst die binäre Schwelle angesehen. Lassen Sie uns eine Liste von Methoden erstellen und sie nacheinander anwenden und die Ergebnisse grafisch darstellen:

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 und THRESH_BINARY_INV sind invers zueinander und binarisieren ein Bild dazwischen 0 und 255, indem Sie sie dem Hintergrund bzw. Vordergrund zuweisen und umgekehrt.

THRESH_TRUNC binarisiert das Bild dazwischen threshold und 255.

THRESH_TOZERO und THRESH_TOZERO_INV binarisieren zwischen 0 und der aktuelle Pixelwert (src(x, y)). Werfen wir einen Blick auf die resultierenden Bilder:

OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Diese Methoden sind intuitiv genug – aber wie können wir einen guten Schwellenwert automatisieren, und was bedeutet ein „guter Schwellenwert“ überhaupt? Die meisten der bisherigen Ergebnisse hatten nicht ideale Masken mit Markierungen und Flecken darin. Dies geschieht aufgrund der Unterschiede in den reflektierenden Oberflächen der Münzen – sie sind nicht einheitlich gefärbt, da die Rillen das Licht unterschiedlich reflektieren.

Wir können dies bis zu einem gewissen Grad bekämpfen, indem wir eine bessere globale Schwelle finden.

Automatisches/optimiertes Thresholding mit OpenCV

OpenCV verwendet zwei effektive Suchmethoden für globale Schwellenwerte – die Methode von Otsu und die Triangle-Methode.

Die Methode von Otsu geht davon aus, dass sie funktioniert bimodal Bilder. Bimodale Bilder sind Bilder, deren Farbhistogramme nur zwei Spitzen enthalten (dh nur zwei unterschiedliche Pixelwerte haben). Wenn man bedenkt, dass die Spitzen jeweils einer Klasse wie „Hintergrund“ und „Vordergrund“ angehören, liegt die ideale Schwelle genau in deren Mitte.

OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
Bildquelle: https://scipy-lectures.org/

Sie können einige Bilder mit Gaußschen Unschärfen bimodaler machen, aber nicht alle.

Ein alternativer, oft leistungsfähigerer Algorithmus ist der Dreiecksalgorithmus, der den Abstand zwischen dem Maximum und dem Minimum des Graustufenhistogramms berechnet und eine Linie zeichnet. Als Schwellenwert wird der Punkt gewählt, an dem diese Linie maximal weit vom Rest des Histogramms entfernt ist:

OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Beide gehen von einem Graustufenbild aus, also müssen wir das Eingabebild via in Grau umwandeln 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)

Lassen Sie uns das Bild mit beiden Methoden durchlaufen und die Ergebnisse visualisieren:

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 in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Hier übertrifft die Dreiecksmethode die Methode von Otsu, da das Bild nicht bimodal ist:

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 in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Es ist jedoch klar, wie die Dreiecksmethode mit dem Bild arbeiten und ein zufriedenstellenderes Ergebnis erzielen konnte.

Einschränkungen der OpenCV-Schwellenwertbestimmung

Die Schwellenwertbildung mit OpenCV ist einfach, leicht und effizient. Es ist jedoch ziemlich begrenzt. Sobald man bunte Elemente, uneinheitliche Hintergründe und wechselnde Lichtverhältnisse einführt, wird globales Thresholding als Konzept zu starr.

Bilder sind normalerweise zu komplex, als dass ein einzelner Schwellenwert ausreichen würde, und dies kann teilweise dadurch angegangen werden adaptive Schwellenbildung, wo viele lokale Schwellenwerte anstelle eines einzigen globalen Schwellenwerts angewendet werden. Obwohl auch begrenzt, ist adaptive Schwellenwertbildung viel flexibler als globale Schwellenwertbildung.

Zusammenfassung

In den letzten Jahren wurde die binäre Segmentierung (wie wir es hier getan haben) und die Multi-Label-Segmentierung (bei der Sie eine beliebige Anzahl von Klassen codieren lassen können) erfolgreich mit Deep-Learning-Netzwerken modelliert, die viel leistungsfähiger und flexibler sind. Darüber hinaus können sie den globalen und lokalen Kontext in die Bilder codieren, die sie segmentieren. Der Nachteil ist – Sie brauchen Daten, um sie zu trainieren, sowie Zeit und Fachwissen.

Für schnelles, einfaches Thresholding können Sie OpenCV verwenden. Für eine genaue Segmentierung auf Produktionsebene sollten Sie neuronale Netze verwenden.

Weiter gehen – Praktisches Deep Learning für Computer Vision

Ihre neugierige Natur macht Lust auf mehr? Wir empfehlen Ihnen, sich unsere anzuschauen Kurs: „Praxisnahes Deep Learning für Computer Vision mit Python“.

OpenCV Thresholding in Python mit cv2.threshold() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Ein weiterer Computer Vision-Kurs?

Wir werden keine Klassifizierung von MNIST-Ziffern oder MNIST-Mode durchführen. Sie haben ihren Teil vor langer Zeit erfüllt. Zu viele Lernressourcen konzentrieren sich auf grundlegende Datensätze und grundlegende Architekturen, bevor fortgeschrittene Blackbox-Architekturen die Last der Leistung schultern.

Wir wollen uns konzentrieren Entmystifizierung, Praktikabilität, Verständnis, Intuition und echte Projekte. Möchte lernen wie du kannst einen Unterschied machen? Wir nehmen Sie mit auf eine Reise von der Art und Weise, wie unser Gehirn Bilder verarbeitet, über das Schreiben eines forschungstauglichen Deep-Learning-Klassifikators für Brustkrebs bis hin zu Deep-Learning-Netzwerken, die „halluzinieren“, Ihnen die Prinzipien und die Theorie durch praktische Arbeit beibringen und Sie mit dem ausstatten Know-how und Tools, um ein Experte für die Anwendung von Deep Learning zur Lösung von Computer Vision zu werden.

Was ist da drin?

  • Die ersten Prinzipien des Sehens und wie Computern das „Sehen“ beigebracht werden kann
  • Verschiedene Aufgaben und Anwendungen von Computer Vision
  • Das Handwerkszeug, das Ihnen die Arbeit erleichtert
  • Suchen, Erstellen und Verwenden von Datensätzen für Computer Vision
  • Die Theorie und Anwendung von Convolutional Neural Networks
  • Umgang mit Domänenverschiebung, Kookkurrenz und anderen Verzerrungen in Datensätzen
  • Übertragen Sie Lernen und nutzen Sie die Trainingszeit und Rechenressourcen anderer zu Ihrem Vorteil
  • Aufbau und Schulung eines hochmodernen Brustkrebsklassifikators
  • Wie man Mainstream-Ideen mit einer gesunden Portion Skepsis begegnet und die Auswirkungen weit verbreiteter Techniken versteht
  • Visualisierung des „Konzeptraums“ eines ConvNet mit t-SNE und PCA
  • Fallstudien darüber, wie Unternehmen Computer-Vision-Techniken einsetzen, um bessere Ergebnisse zu erzielen
  • Richtige Modellbewertung, Visualisierung des latenten Raums und Identifizierung der Aufmerksamkeit des Modells
  • Durchführen von Domänenrecherchen, Bearbeiten eigener Datensätze und Etablieren von Modelltests
  • Modernste Architekturen, die Weiterentwicklung von Ideen, was sie einzigartig macht und wie man sie umsetzt
  • KerasCV – eine WIP-Bibliothek zum Erstellen hochmoderner Pipelines und Modelle
  • Wie man Papiere parst, liest und selbst umsetzt
  • Modellauswahl je nach Anwendung
  • Erstellen einer End-to-End-Pipeline für maschinelles Lernen
  • Landschaft und Intuition zur Objekterkennung mit Faster R-CNNs, RetinaNets, SSDs und YOLO
  • Instanz- und semantische Segmentierung
  • Objekterkennung in Echtzeit mit YOLOv5
  • Training von YOLOv5-Objektdetektoren
  • Arbeiten mit Transformers unter Verwendung von KerasNLP (industriestarke WIP-Bibliothek)
  • Integrieren von Transformers in ConvNets zum Generieren von Bildunterschriften
  • DeepDream
  • Deep-Learning-Modelloptimierung für Computer Vision

Zeitstempel:

Mehr von Stapelmissbrauch