OpenCV Threshold ( Python , C++ )
On ianuarie 4, 2022 by adminCe este pragarea imaginilor?
Observați cu atenție animația de mai jos (Figura 1). Câte numere vedeți? Cei mai mulți dintre voi vor vedea numere: 32 (oh da, priviți cu atenție), 64, 100, 128, 180, 200 și 255. Dar imaginea este mai mult decât ceea ce se vede cu ochiul liber.
Într-o secundă puteți vedea versiunea cu prag a imaginii originale. Veți observa că toate numerele par complet albe ( adică au o valoare a scalei de gri de 255 ) și că există un număr 5 în plus. Nu ați observat numărul 5 în imaginea originală pentru că valoarea sa de nivel de gri era, ei bine, 5. De fapt, toate numerele din imaginea originală au o valoare a scalei de gri egală cu numărul. Prin urmare, 255 este cea mai luminoasă și 5 este cea mai întunecată.
Citerea numerelor în imaginea cu prag este mult mai ușoară decât citirea numerelor în imaginea originală. Nu este surprinzător faptul că un algoritm de recunoaștere a textului va găsi imaginea cu prag din exemplul nostru mult mai ușor de procesat decât imaginea originală.
În Computer Vision, atunci când faci o sarcină mai ușoară pentru oameni, de obicei o faci mai ușoară și pentru algoritmii de calculator.
Toți algoritmii de pragare iau ca intrare o imagine sursă (src) și o valoare de prag (thresh) și produc o imagine de ieșire (dst) prin compararea valorii pixelului la pixelul sursă ( x , y ) cu pragul. Dacă src ( x , y ) > thresh , atunci dst ( x , y ) primește o anumită valoare. În caz contrar, lui dst ( x , y ) i se atribuie o altă valoare.
Cea mai simplă formă de pragulare se numește pragulare binară (Binary Thresholding). În plus față de imaginea sursă (src) și de valoarea pragului (thresh), aceasta ia un alt parametru de intrare numit valoare maximă ( maxValue ). La fiecare locație a pixelului (x,y) se compară valoarea pixelului src ( x , y ) cu thresh. Dacă src ( x , y ) este mai mare decât thresh, setează valoarea pixelului imaginii de destinație dst ( x , y ) la maxValue. În caz contrar, setează valoarea la zero. Iată cum arată pseudo-codul.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Mai general, există mai multe tipuri de pragare bazate pe diferite reguli de prag aplicate la src ( x , y ) pentru a obține dst ( x , y ). Să ne uităm la diferitele tipuri de praguri disponibile în OpenCV.
Exemple de praguri: C++ și Python
Dacă vă grăbiți, săriți la secțiunea de descărcare pentru a obține codul și imaginea de exemplu.
Imagine de intrare
În următoarele exemple, vom folosi această imagine ca intrare. Faceți clic pe Figura 2 pentru a descărca imaginea în format PNG. Imaginea de intrare conține numere scrise cu intensitate ( valoare pe scară de gri ) egală cu numărul însuși. De exemplu, valoarea în pixeli a numărului 200 este 200, iar cea a numărului 32 este 32. Acesta este motivul pentru care 32 apare mult mai întunecat decât 200 în imagine.
În fiecare exemplu, vom explica regula de pragare prin intermediul unui pseudocod, vom oferi un exemplu C++ și python și imaginea de ieșire cu prag.
Binary Thresholding ( type = THRESH_BINARY )
Acesta este cel mai comun și mai simplu tip de pragare.
Regula de pragare
# 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);
Rezultatul pragului binar
Figura 3 prezintă rezultatul aplicării pragării binare la imaginea de intrare cu thresh = 0 și maxValue = 255.
Modificarea thresh la 127 elimină toate numerele mai mici sau egale cu 127.
Schimbarea maxValue la 128 stabilește valoarea regiunilor cu prag la 128.
Terminare binară inversă ( type = THRESH_BINARY_INV )
Terminarea binară inversă este exact opusul pragării binare. Pixelul de destinație este setat la zero dacă pixelul sursă corespunzător este mai mare decât pragul, și la maxValoare, dacă pixelul sursă este mai mic decât pragul.
Regula de pragare
# 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);
Rezultatul pragului binar invers
Rețineți că rezultatul pragării binare inverse prezentat în figura 6 este exact inversul figurii 4.
Truncate Thresholding ( type = THRESH_TRUNC )
În acest tip de prag, pixelul de destinație este setat la pragul ( thresh ) dacă valoarea pixelului sursă este mai mare decât pragul. În caz contrar, este setat la valoarea pixelului sursă. maxValue este ignorat.
Regula de pragare
# 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);
Rezultatul aplicării pragului de trunchiere
Figura 7 prezintă rezultatul aplicării pragului de trunchiere la imaginea de intrare. Observați că toate valorile care depășesc pragul ( 127 ) sunt setate la 127, iar toate valorile mai mici sau egale cu 127 rămân neschimbate. maxValue este ignorat.
Threshold to Zero ( type = THRESH_TOZERO )
În acest tip de pragare, valoarea pixelului de destinație este setată la valoarea pixelului sursă corespunzătoare dacă valoarea pixelului sursă este mai mare decât pragul. În caz contrar, este setată la zero. maxValue este ignorată.
Regula pragului
# 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);
Rezultat al pragului la zero
Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
În acest tip de pragare, valoarea pixelului de destinație este setată la zero dacă valoarea pixelului sursă este mai mare decât pragul. În caz contrar, este setată la valoarea pixelului sursă. maxValue este ignorată.
Regula de pragare
# 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);
Rezultatul aplicării pragului inversat la zero
Figura 9 prezintă rezultatul aplicării pragului inversat la zero la imaginea de intrare. Numerele de sub prag își păstrează valoarea în tonuri de gri, iar numerele de deasupra pragului sunt 0, cu excepția limitei. Artefactele de la graniță se datorează faptului că valorile pixelilor de la graniță trec de la 0 la valoarea numărului pe parcursul a câtorva pixeli. Astfel, unii dintre pixelii de la graniță sunt sub prag.
Descărcați codul și imaginea de exemplu
.
Lasă un răspuns