Skip to content

Archives

  • ianuarie 2022
  • decembrie 2021
  • noiembrie 2021
  • octombrie 2021
  • septembrie 2021

Categories

  • Nicio categorie
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On ianuarie 4, 2022 by admin
  • Ce este pragarea imaginilor?
  • Exemple de praguri: C++ și Python
  • Imagine de intrare
  • Binary Thresholding ( type = THRESH_BINARY )
  • Truncate Thresholding ( type = THRESH_TRUNC )
  • Descărcați codul și imaginea de exemplu

Ce 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ă.

Această postare a fost testată pe OpenCV 4.4.

Î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.

Figura 2: Imagine de intrare. Faceți clic pentru a deschide un PNG de înaltă rezoluție într-o altă fereastră

Î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.

Figura 3 : Binary Threshold ( thresh = 0 și maxValue = 255)

Modificarea thresh la 127 elimină toate numerele mai mici sau egale cu 127.

Figura 4 : Binary Threshold ( thresh = 127 și maxValue = 255)

Schimbarea maxValue la 128 stabilește valoarea regiunilor cu prag la 128.

Figura 5: Prag binar cu maxValue setat 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.

Figura 6 : Prag binar inversat ( thresh = 127, maxValue = 0 )

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.

Figura 7 : Truncate thresholding (thresh = 127)

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

Figura 8: Threshold to Zero ( thresh = 127 )

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.

Figura 9: Pragul inversat la zero ( thresh = 127 )

Descărcați codul și imaginea de exemplu

.

Lasă un răspuns Anulează răspunsul

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Arhive

  • ianuarie 2022
  • decembrie 2021
  • noiembrie 2021
  • octombrie 2021
  • septembrie 2021

Meta

  • Autentificare
  • Flux intrări
  • Flux comentarii
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress