OpenCV Threshold ( Python , C++ )
On januari 4, 2022 by adminWat is het dorsen van afbeeldingen?
Kijk aandachtig naar de onderstaande animatie (figuur 1). Hoeveel getallen zie je? De meesten van jullie zullen de getallen zien: 32 (o ja, kijk goed), 64, 100, 128, 180, 200 en 255. Maar er is meer aan de hand dan wat je op het eerste gezicht zou zeggen.
In een seconde zie je de gedrempelde versie van het originele beeld. U zult zien dat alle getallen er volledig wit uitzien ( d.w.z. ze hebben een grijswaarde van 255 ) en dat er een extra getal 5 is. Het getal 5 was u niet opgevallen in de originele afbeelding omdat de grijswaarde ervan, nou ja, 5 was. In feite hebben alle getallen in de originele afbeelding een grijswaarde gelijk aan het getal. Daarom is 255 het helderst en 5 het donkerst.
Het lezen van getallen in de gedrempelde afbeelding is veel gemakkelijker dan het lezen van getallen in de originele afbeelding. Het is dan ook geen verrassing dat een tekstherkenningsalgoritme de gedrempelde afbeelding in ons voorbeeld veel gemakkelijker zal vinden om te verwerken dan de originele afbeelding.
In Computer Vision geldt dat wanneer je een taak gemakkelijker maakt voor mensen, je hem doorgaans ook gemakkelijker maakt voor computeralgoritmen.
Alle dresholding-algoritmen nemen een bronafbeelding (src) en een drempelwaarde (thresh) als invoer en produceren een uitvoerafbeelding (dst) door de pixelwaarde op bronpixel ( x , y ) te vergelijken met de drempelwaarde. Indien src ( x , y ) > dresh , dan wordt aan dst ( x , y ) een waarde toegekend. Anders wordt aan dst ( x , y ) een andere waarde toegekend.
De eenvoudigste vorm van thresholding wordt Binary Thresholding genoemd. Naast de bronafbeelding (src) en de drempelwaarde (thresh), neemt het een andere invoerparameter genaamd maximumwaarde ( maxValue ). Op elke pixelplaats (x,y) vergelijkt het de pixelwaarde src ( x , y ) met thresh. Als src ( x , y ) groter is dan thresh, stelt het de waarde van de bestemmingsbeeld pixel dst ( x , y ) in op maxValue. Zo niet, dan wordt de waarde op nul gezet. Hier is hoe de pseudo-code eruit ziet.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Meer in het algemeen, er zijn vele soorten van thresholding gebaseerd op verschillende drempel regels toegepast op src ( x , y ) om dst ( x , y ) te krijgen. Laten we eens kijken naar de verschillende drempel types die beschikbaar zijn in OpenCV.
Drempel voorbeelden: C++ en Python
Als u haast heeft, spring dan naar de download sectie om code en voorbeeld afbeelding te krijgen.
Input Image
In de volgende voorbeelden, zullen we deze afbeelding als input gebruiken. Klik op afbeelding 2 om de afbeelding in PNG-formaat te downloaden. De input afbeelding bevat getallen geschreven met intensiteit ( grijswaarde ) gelijk aan het getal zelf. Bv. de pixelwaarde van het getal 200 is 200, en die van 32 is 32. Daarom lijkt 32 veel donkerder dan 200 in het beeld.
In elk voorbeeld zullen we de regel van het dorsen uitleggen via een pseudo-code, een C++ en python voorbeeld geven, en het gedrempelde uitgangsbeeld.
Binaire dorsen ( type = THRESH_BINARY )
Dit is de meest voorkomende en eenvoudigste vorm van dorsen.
Thresholding rule
# 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);
Resultaat van Binary Threshold
Figuur 3 toont het resultaat van het toepassen van binair thresholding op de invoerafbeelding met thresh = 0 en maxValue = 255.
Wanneer u thresh wijzigt in 127, worden alle getallen kleiner dan of gelijk aan 127 verwijderd.
Wanneer u maxValue wijzigt in 128, wordt de waarde van de regio’s met drempelwaarde ingesteld op 128.
Invers binair dorsen ( type = THRESH_BINARY_INV )
Invers binair dorsen is precies het tegenovergestelde van binair dorsen. De bestemmingspixel wordt op nul gezet als de overeenkomstige bronpixel groter is dan de drempelwaarde, en op maxValue, als de bronpixel kleiner is dan de drempelwaarde.
Thresholding rule
# 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);
Resultaat van Inverse Binary Threshold
Merk op dat het resultaat van inverse binaire thresholding dat in figuur 6 wordt getoond, precies het omgekeerde is van figuur 4.
Truncate Thresholding ( type = THRESH_TRUNC )
Bij dit type thresholding wordt de bestemmingspixel ingesteld op de drempelwaarde ( thresh ) als de waarde van de bronpixel groter is dan de drempelwaarde. Anders wordt het ingesteld op de waarde van de bronpixel. maxValue wordt genegeerd.
Thresholding rule
# 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);
Resultaat van Truncate Thresholding
Figuur 7 toont het resultaat van het toepassen van Truncate Thresholding op de invoerafbeelding. Merk op dat alle waarden boven de drempel ( 127 ) worden ingesteld op 127, en dat alle waarden kleiner dan of gelijk aan 127 ongewijzigd blijven. maxValue wordt genegeerd.
Threshold to Zero ( type = THRESH_TOZERO )
Bij deze vorm van thresholding wordt de waarde van de bestemmingspixel ingesteld op de overeenkomstige waarde van de bronpixel als de waarde van de bronpixel groter is dan de drempelwaarde. Zo niet, dan wordt de waarde op nul gezet. maxValue wordt genegeerd.
Thresholding regel
# 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);
Resultaat van Threshold to Zero
Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
Bij deze vorm van thresholding wordt de waarde van de doelpixel op nul gesteld als de waarde van de bronpixel hoger is dan de drempelwaarde. Anders wordt de waarde ingesteld op de pixelwaarde van de bron. maxValue wordt genegeerd.
Thresholding rule
# 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);
Resultaat van Inverted Threshold to Zero
Figuur 9 toont het resultaat van het toepassen van Inverted Threshold to Zero op de invoerafbeelding. De getallen onder de drempel behouden hun grijswaarde, en de getallen boven de drempel zijn 0 behalve voor de grens. De artefacten op de grens zijn te wijten aan het feit dat de pixelwaarden op de grens overgaan van 0 naar de waarde van het getal over een paar pixels. Sommige grenspixels liggen dus onder de drempel.
Geef een antwoord