OpenCV Threshold ( Python , C++ )
On januar 4, 2022 by adminHvad er billedets tærskelværdi?
Se nøje på animationen nedenfor (Figur 1). Hvor mange tal kan du se? De fleste af jer vil se tallene: 32 (åh ja, se godt efter), 64, 100, 128, 180, 200 og 255. Men der er mere i billedet, end hvad der møder øjet.
I et sekund kan du se den tærskelværdiberigtigede version af det originale billede. Du vil bemærke, at alle tallene ser helt hvide ud ( dvs. de har en gråskala-værdi på 255 ), og der er et ekstra tal 5. Du lagde ikke mærke til tallet 5 i det oprindelige billede, fordi dets gråskalaværdi var, ja, 5. Faktisk har alle tallene i det oprindelige billede en gråskalaværdi, der svarer til tallet. Derfor er 255 det lyseste og 5 det mørkeste.
Læsning af tal i det tærskeljusterede billede er meget nemmere end læsning af tal i det originale billede. Det er ikke overraskende, at en algoritme til tekstgenkendelse vil finde det tærskeljusterede billede i vores eksempel meget nemmere at behandle end det originale billede.
I Computer Vision når man gør en opgave nemmere for mennesker, gør man den typisk også nemmere for computeralgoritmer.
Alle tærskelalgoritmer tager et kildebillede (src) og en tærskelværdi (thresh) som input og producerer et outputbillede (dst) ved at sammenligne pixelværdien på kildepixel ( x , y ) med tærskelværdien. Hvis src ( x , y ) > tærskel , så tildeles dst ( x , y ) en vis værdi. Ellers tildeles dst ( x , y ) en anden værdi.
Den enkleste form for tærskelværdiberegning kaldes binær tærskelværdiberegning. Ud over kildebilledet (src) og tærskelværdien (thresh) tager den en anden indgangsparameter, der hedder maksimalværdi ( maxValue ). Ved hver pixelplacering (x,y) sammenligner den pixelværdien src ( x , y ) med tærsk. Hvis src ( x , y ) er større end tærskelværdien, sættes værdien af destinationsbilledets pixel dst ( x , y ) til maxValue. Ellers sættes den til nul. Her er, hvordan pseudokoden ser ud.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Mere generelt er der mange typer af tærskelværdier baseret på forskellige tærskelregler, der anvendes på src ( x , y ) for at få dst ( x , y ). Lad os se på de forskellige tærskeltyper, der er tilgængelige i OpenCV.
Tærskel Eksempler: C++ og Python
Hvis du har travlt, kan du springe til download-sektionen for at få kode og eksempelbillede.
Inputbillede
I de følgende eksempler vil vi bruge dette billede som input. Klik på figur 2 for at downloade billedet i PNG-format. Indtastningsbilledet indeholder tal skrevet med intensitet ( gråskalaværdi ) svarende til selve tallet. F.eks. er pixelværdien for tallet 200 200 er 200, og pixelværdien for 32 er 32. Derfor fremstår 32 meget mørkere end 200 i billedet.
I hvert eksempel vil vi forklare tærskelreglen via en pseudokode, give C++- og python-eksempel og det tærskelberigede udgangsbillede.
Binary Thresholding ( type = THRESH_BINARY )
Dette er den mest almindelige og enkleste type tærskelberegning.
Tærskelregel
# 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 af binær tærskel
Figur 3 viser resultatet af anvendelse af binær tærskel på indgangsbilledet med tærskel = 0 og maxValue = 255.
Hvis man ændrer thresh til 127, fjernes alle tal, der er mindre end eller lig med 127.
Hvis man ændrer maxVærdi til 128, sættes værdien af de tærskelbelagte områder til 128.
Invers binær tærskel ( type = THRESH_BINARY_INV )
Invers binær tærskel er lige det modsatte af binær tærskel. Destinationspixlen sættes til nul, hvis den tilsvarende kildepixel er større end tærskelværdien, og til maxValue, hvis kildepixlen er mindre end tærskelværdien.
Tærskelregel
# 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);
Resultat af omvendt binær tærskel
Bemærk, at resultatet af omvendt binær tærskel, der er vist i figur 6, er præcis det omvendte af figur 4.
Truncate Thresholding ( type = THRESH_TRUNC )
I denne type tærskelværdiindstilling sættes destinationspixlen til tærskelværdien ( thresh ), hvis kildepixelværdien er større end tærskelværdien. I modsat fald sættes den til kildepixelværdien. maxValue ignoreres.
Tærskelregel
# 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);
Resultat af Truncate Thresholding
Figur 7 viser resultatet af anvendelse af Truncate Thresholding på indgangsbilledet. Bemærk, at alle værdier over tærskelværdien ( 127 ) sættes til 127, og at alle værdier mindre end eller lig med 127 er uændrede. maxValue ignoreres.
Tærskel til nul ( type = THRESH_TOZERO )
I denne form for tærskelværdiindstilling sættes destinationspixelværdien til den tilsvarende kildepixelværdi, hvis kildepixelværdien er større end tærskelværdien. I modsat fald sættes den til nul. maxValue ignoreres.
Tærskelregel
# 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 af tærskelværdi til nul
Inverteret tærskel til nul ( type = THRESH_TOZERO_INV)
I denne form for tærskelværdifastsættelse sættes destinationspixelværdien til nul, hvis kildepixelværdien er større end tærskelværdien. Ellers sættes den til kildepixelværdien. maxValue ignoreres.
Tærskelregel
# 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);
Resultat af Inverted Threshold to Zero
Figur 9 viser resultatet af at anvende Inverted Threshold to Zero på indgangsbilledet. Tallene under tærsklen beholder deres gråskalaværdi, og tallene over tærsklen er 0 med undtagelse af grænsen. Artefakterne ved grænsen skyldes, at pixelværdierne ved grænsen overgår fra 0 til værdien af tallet over nogle få pixels. Så nogle af grænsepixlerne ligger under tærskelværdien.
Skriv et svar