OpenCV Threshold ( Python , C++ )
On Januar 4, 2022 by adminWas 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.
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.
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.
Wenn thresh auf 127 geändert wird, werden alle Zahlen kleiner oder gleich 127 entfernt.
Das Ändern von maxValue auf 128 setzt den Wert der mit Schwellenwerten versehenen Bereiche auf 128.
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.
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.
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
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.
Schreibe einen Kommentar