Skip to content

Archives

  • Januar 2022
  • Dezember 2021
  • November 2021
  • Oktober 2021
  • September 2021

Categories

  • Keine Kategorien
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On Januar 4, 2022 by admin
  • Was ist eine Schwellenwertberechnung für Bilder?
  • Schwellenwertbeispiele: C++ und Python
  • Eingabebild
  • Binäres Thresholding ( type = THRESH_BINARY )
  • Inverses binäres Thresholding ( type = THRESH_BINARY_INV )
  • Truncate Thresholding ( type = THRESH_TRUNC )
  • Threshold to Zero ( type = THRESH_TOZERO )
  • Invertierter Schwellenwert bis Null ( type = THRESH_TOZERO_INV)
  • Laden Sie den Code und das Beispielbild herunter

Was ist eine Schwellenwertberechnung für Bilder?

Betrachte die folgende Animation (Abbildung 1) aufmerksam. Wie viele Zahlen sehen Sie? Die meisten von euch werden die Zahlen sehen: 32 (oh ja, schauen Sie genau hin), 64, 100, 128, 180, 200 und 255. Aber das Bild hat mehr zu bieten, als man auf den ersten Blick sieht.

In einer Sekunde können Sie die mit Schwellenwerten versehene Version des Originalbildes sehen. Sie werden feststellen, dass alle Zahlen komplett weiß aussehen (d. h. sie haben einen Graustufenwert von 255) und dass es eine zusätzliche Zahl 5 gibt. Sie haben die Zahl 5 im Originalbild nicht bemerkt, weil ihr Graustufenwert, nun ja, 5 war. Tatsächlich haben alle Zahlen im Originalbild den gleichen Graustufenwert wie die Zahl. Daher ist 255 der hellste und 5 der dunkelste Wert.

Das Lesen von Zahlen im mit Schwellenwerten versehenen Bild ist viel einfacher als das Lesen von Zahlen im Originalbild. Es überrascht nicht, dass ein Texterkennungsalgorithmus das mit Schwellenwerten versehene Bild in unserem Beispiel viel leichter verarbeiten kann als das Originalbild.

Dieser Beitrag wurde mit OpenCV 4.4 getestet.

Wenn man eine Aufgabe für Menschen einfacher macht, macht man sie normalerweise auch für Computeralgorithmen einfacher.

Alle Schwellenwertalgorithmen nehmen ein Quellbild (src) und einen Schwellenwert (thresh) als Eingabe und erzeugen ein Ausgabebild (dst), indem sie den Pixelwert am Quellpixel ( x , y ) mit dem Schwellenwert vergleichen. Wenn src ( x , y ) > thresh , dann wird dst ( x , y ) ein bestimmter Wert zugewiesen. Andernfalls wird dst ( x , y ) ein anderer Wert zugewiesen.

Die einfachste Form der Schwellenwertbildung ist die binäre Schwellenwertbildung. Neben dem Quellbild (src) und dem Schwellenwert (thresh) benötigt sie einen weiteren Eingabeparameter, den Maximalwert ( maxValue ). An jeder Pixelposition (x,y) vergleicht es den Pixelwert src ( x , y ) mit thresh. Ist src ( x , y ) größer als thresh, setzt es den Wert des Zielbildpixels dst ( x , y ) auf maxValue. Andernfalls wird er auf Null gesetzt. So sieht der Pseudocode aus.

# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Allgemein gibt es viele Arten von Schwellenwerten, die auf verschiedenen Schwellenwertregeln basieren, die auf src ( x , y ) angewendet werden, um dst ( x , y ) zu erhalten. Sehen wir uns die verschiedenen in OpenCV verfügbaren Schwellenwerttypen an.

Schwellenwertbeispiele: C++ und Python

Wenn Sie es eilig haben, können Sie sich den Code und das Beispielbild herunterladen.

Eingabebild

In den folgenden Beispielen werden wir dieses Bild als Eingabe verwenden. Klicken Sie auf Abbildung 2, um das Bild im PNG-Format herunterzuladen. Das Eingabebild enthält Zahlen mit einer Intensität (Graustufenwert), die der Zahl selbst entspricht. So ist z. B. der Pixelwert der Zahl 200 gleich 200 und der von 32 gleich 32. Deshalb erscheint 32 im Bild viel dunkler als 200.

Abbildung 2: Eingabebild. Klicken Sie hier, um ein hochauflösendes PNG in einem anderen Fenster zu öffnen

In jedem Beispiel wird die Schwellenwertregel anhand eines Pseudocodes erklärt, ein C++- und Python-Beispiel bereitgestellt und das mit Schwellenwerten versehene Ausgabebild gezeigt.

Binäres Thresholding ( type = THRESH_BINARY )

Dies ist die gängigste und einfachste Art des Thresholding.

Thresholding-Regel

# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Python

# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

C++

using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);

Ergebnis der binären Schwellenwertbildung

Abbildung 3 zeigt das Ergebnis der Anwendung der binären Schwellenwertbildung auf das Eingabebild mit thresh = 0 und maxValue = 255.

Abbildung 3: Binärer Schwellenwert ( thresh = 0 und maxValue = 255)

Wenn thresh auf 127 geändert wird, werden alle Zahlen kleiner oder gleich 127 entfernt.

Abbildung 4: Binärer Schwellenwert ( thresh = 127 und maxValue = 255)

Das Ändern von maxValue auf 128 setzt den Wert der mit Schwellenwerten versehenen Bereiche auf 128.

Abbildung 5: Binärer Schwellenwert mit maxValue auf 128 gesetzt

Inverses binäres Thresholding ( type = THRESH_BINARY_INV )

Inverses binäres Thresholding ist genau das Gegenteil von binärem Thresholding. Das Zielpixel wird auf Null gesetzt, wenn das entsprechende Quellpixel größer als der Schwellenwert ist, und auf maxValue, wenn das Quellpixel kleiner als der Schwellenwert ist.

Schwellenwertregel

# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);

Ergebnis der inversen binären Schwellenwertbildung

Beachten Sie, dass das in Abbildung 6 dargestellte Ergebnis der inversen binären Schwellenwertbildung genau das Gegenteil von Abbildung 4 ist.

Abbildung 6: Inverse binäre Schwellenwertbildung ( thresh = 127, maxValue = 0 )

Truncate Thresholding ( type = THRESH_TRUNC )

Bei dieser Art der Schwellenwertbildung wird das Zielpixel auf den Schwellenwert ( thresh ) gesetzt, wenn der Wert des Quellpixels größer als der Schwellenwert ist. Andernfalls wird er auf den Wert des Quellpixels gesetzt. maxValue wird ignoriert.

Thresholding-Regel

# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)

C++

threshold(src,dst, thresh, maxValue, THRESH_TRUNC);

Ergebnis des Truncate Thresholding

Abbildung 7 zeigt das Ergebnis der Anwendung des Truncate Thresholding auf das Eingabebild. Beachten Sie, dass alle Werte oberhalb des Schwellenwerts ( 127 ) auf 127 gesetzt werden und alle Werte kleiner oder gleich 127 unverändert bleiben. maxValue wird ignoriert.

Abbildung 7 : Truncate thresholding (thresh = 127)

Threshold to Zero ( type = THRESH_TOZERO )

Bei dieser Art der Schwellenwertbildung wird der Zielpixelwert auf den entsprechenden Quellpixelwert gesetzt, wenn der Quellpixelwert größer als der Schwellenwert ist. Andernfalls wird er auf Null gesetzt. maxValue wird ignoriert.

Schwellenwertregel

# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO);

Ergebnis von Threshold to Zero

Abbildung 8: Schwellenwert bis Null ( thresh = 127 )

Invertierter Schwellenwert bis Null ( type = THRESH_TOZERO_INV)

Bei dieser Art der Schwellenwertbildung wird der Zielpixelwert auf Null gesetzt, wenn der Quellpixelwert größer als der Schwellenwert ist. Andernfalls wird er auf den Quellpixelwert gesetzt. maxValue wird ignoriert.

Thresholding-Regel

# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);

Ergebnis von Inverted Threshold to Zero

Abbildung 9 zeigt das Ergebnis der Anwendung von Inverted Threshold to Zero auf das Eingabebild. Die Zahlen unterhalb des Schwellenwerts behalten ihren Graustufenwert bei, und die Zahlen oberhalb des Schwellenwerts sind 0, mit Ausnahme des Randes. Die Artefakte an der Grenze sind darauf zurückzuführen, dass die Pixelwerte an der Grenze über einige Pixel hinweg von 0 auf den Wert der Zahl übergehen. Daher liegen einige der Randpixel unter dem Schwellenwert.

Abbildung 9: Invertierter Schwellenwert auf Null ( thresh = 127 )

Laden Sie den Code und das Beispielbild herunter

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Archive

  • Januar 2022
  • Dezember 2021
  • November 2021
  • Oktober 2021
  • September 2021

Meta

  • Anmelden
  • Feed der Einträge
  • Kommentare-Feed
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress