OpenCV Threshold ( Python , C++ )
On januari 4, 2022 by adminVad är tröskelbehandling av bilder?
Observera noga animationen nedan (Figur 1). Hur många siffror ser du? De flesta av er kommer att se siffrorna: 32 (ja, titta noga), 64, 100, 128, 180, 200 och 255. Men det finns mer i bilden än vad som möter ögat.
Om en sekund kan du se den tröskelvärderade versionen av originalbilden. Du kommer att märka att alla siffror ser helt vita ut ( dvs. de har ett gråskalavärde på 255 ) och att det finns en extra siffra 5. Du lade inte märke till siffran 5 i originalbilden eftersom dess gråskalavärde var, ja, 5. I själva verket har alla siffror i originalbilden ett gråskalavärde som är lika stort som siffran. Därför är 255 det ljusaste och 5 det mörkaste.
Läsning av siffror i den trösklade bilden är mycket lättare än att läsa siffror i originalbilden. Inte överraskande kommer en algoritm för textigenkänning att tycka att den trösklade bilden i vårt exempel är mycket lättare att bearbeta än originalbilden.
I Computer Vision när man gör en uppgift lättare för människor gör man den vanligtvis också lättare för datoralgoritmer.
Alla tröskelalgoritmer tar en källbild (src) och ett tröskelvärde (thresh) som indata och producerar en utgångsbild (dst) genom att jämföra pixelvärdet vid källpixeln ( x , y ) med tröskelvärdet. Om src ( x , y ) > thresh , tilldelas dst ( x , y ) ett visst värde. I annat fall tilldelas dst ( x , y ) något annat värde.
Den enklaste formen av tröskelvärdering kallas binär tröskelvärdering. Förutom källbilden (src) och tröskelvärdet (thresh) tar den ytterligare en ingångsparameter som kallas maximalt värde ( maxValue ). Vid varje pixelposition (x,y) jämförs pixelvärdet src ( x , y ) med thresh. Om src ( x , y ) är större än tröskelvärdet, sätts värdet för målbildens pixel dst ( x , y ) till maxValue. I annat fall sätts värdet till noll. Så här ser pseudokoden ut.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Mer generellt finns det många typer av tröskelvärdering som bygger på olika tröskelregler som tillämpas på src ( x , y ) för att få fram dst ( x , y ). Låt oss titta på de olika tröskeltyperna som finns tillgängliga i OpenCV.
Threshold Examples: C++ och Python
Om du har bråttom kan du hoppa till nedladdningsavsnittet för att få kod och exempelbild.
Input Image
I följande exempel kommer vi att använda denna bild som input. Klicka på figur 2 för att ladda ner bilden i PNG-format. Ingångsbilden innehåller siffror skrivna med intensitet ( gråskalavärde ) som är lika med själva siffran. Exempelvis är pixelvärdet för talet 200 200, och pixelvärdet för 32 är 32. Det är därför som 32 verkar mycket mörkare än 200 i bilden.
I varje exempel kommer vi att förklara tröskelregeln med hjälp av en pseudokod, ge C++- och pythonexempel samt den tröskelbehandlade utdatabilden.
Binary Thresholding ( type = THRESH_BINARY )
Det här är den vanligaste och enklaste typen av tröskelbehandling.
Tröskelregel
# 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);
Resultat av binär tröskel
Figur 3 visar resultatet av att applicera binär tröskel på den inkommande bilden med thresh = 0 och maxValue = 255.
Om thresh ändras till 127 tas alla tal som är mindre än eller lika med 127 bort.
Om maxValue ändras till 128 sätts värdet för de trösklade områdena till 128.
Invers binärt tröskelvärde ( typ = THRESH_BINARY_INV )
Invers binärt tröskelvärde är raka motsatsen till binärt tröskelvärde. Målpixeln sätts till noll om motsvarande källpixel är större än tröskelvärdet och till maxValue om källpixeln är mindre än tröskelvärdet.
Tröskelregel
# 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);
Resultatet av omvänd binär tröskel
Bemärk att resultatet av omvänd binär tröskel som visas i figur 6 är exakt det omvända av figur 4.
Truncate Thresholding ( type = THRESH_TRUNC )
I den här typen av tröskling sätts målpixeln till tröskelvärdet ( thresh ) om värdet på källpixeln är större än tröskeln. I annat fall sätts den till källpixelvärdet. maxValue ignoreras.
Tröskelregel
# 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);
Resultatet av Truncate Thresholding
Figur 7 visar resultatet av att tillämpa Truncate Thresholding på den ingående bilden. Observera att alla värden över tröskelvärdet ( 127 ) sätts till 127, och alla värden mindre än eller lika med 127 är oförändrade. maxValue ignoreras.
Threshold to Zero ( type = THRESH_TOZERO )
I den här typen av tröskling sätts målpixelns värde till motsvarande källapixelns värde om källpixelns värde är större än tröskeln. I annat fall sätts det till noll. maxValue ignoreras.
Tröskelregel
# 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);
Resultat av tröskel till noll
Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
I denna typ av tröskling sätts målpixelvärdet till noll om källpixelvärdet är större än tröskelvärdet. I annat fall sätts det till källpixelvärdet. maxValue ignoreras.
Tröskelregel
# 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);
Resultatet av inverterat tröskelvärde till noll
Figur 9 visar resultatet av att tillämpa inverterat tröskelvärde till noll på den ingående bilden. Siffrorna under tröskelvärdet behåller sitt gråskalavärde, och siffrorna över tröskelvärdet är 0 med undantag för gränsen. Artefakterna vid gränsen beror på att pixelvärdena vid gränsen övergår från 0 till talets värde över några få pixlar. Så en del av gränspixlarna ligger under tröskelvärdet.
Ladda ner kod och exempelbild
.
Lämna ett svar