Salta al contenuto

Archivi

  • Gennaio 2022
  • Dicembre 2021
  • Novembre 2021
  • Ottobre 2021
  • Settembre 2021

Categorie

  • Nessuna categoria
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

Il Gennaio 4, 2022 da admin
  • Che cos’è il thresholding delle immagini?
  • Esempi di soglia: C++ e Python
  • Input Image
  • Binary Thresholding ( type = THRESH_BINARY )
  • Soglia binaria inversa ( tipo = THRESH_BINARY_INV )
  • Truncate Thresholding ( type = THRESH_TRUNC )
  • Threshold to Zero ( type = THRESH_TOZERO )
  • Soglia invertita a zero ( tipo = THRESH_TOZERO_INV)
  • Scarica il codice e l’immagine di esempio

Che cos’è il thresholding delle immagini?

Osserva attentamente l’animazione qui sotto (Figura 1). Quanti numeri vedete? La maggior parte di voi vedrà i numeri: 32 (oh sì, guardate attentamente), 64, 100, 128, 180, 200 e 255. Ma nell’immagine c’è molto di più di quello che si vede.

In un secondo potete vedere la versione con soglia dell’immagine originale. Noterete che tutti i numeri sembrano completamente bianchi (cioè hanno un valore di scala di grigi di 255) e c’è un numero 5 in più. Non hai notato il numero 5 nell’immagine originale perché il suo valore di scala di grigi era, beh, 5. Infatti, tutti i numeri nell’immagine originale hanno un valore di scala di grigi uguale al numero. Quindi 255 è il più luminoso e 5 è il più scuro.

Leggere i numeri nell’immagine con soglia è molto più facile che leggere i numeri nell’immagine originale. Non sorprende che un algoritmo di riconoscimento del testo troverà l’immagine sogliata nel nostro esempio molto più facile da elaborare rispetto all’immagine originale.

Questo post è stato testato su OpenCV 4.4.

In Computer Vision quando si rende un compito più facile per gli umani, di solito lo si rende più facile anche per gli algoritmi informatici.

Tutti gli algoritmi di soglia prendono un’immagine sorgente (src) e un valore di soglia (thresh) come input e producono un’immagine di output (dst) confrontando il valore del pixel al pixel sorgente ( x , y ) con la soglia. Se src ( x , y ) > thresh , allora a dst ( x , y ) viene assegnato un certo valore. Altrimenti, a dst ( x , y ) viene assegnato qualche altro valore.

La forma più semplice di thresholding è chiamata Binary Thresholding. Oltre all’immagine sorgente (src) e al valore di soglia (thresh), prende un altro parametro di input chiamato valore massimo ( maxValue ). Ad ogni posizione del pixel (x,y) confronta il valore del pixel src ( x , y ) con thresh. Se src ( x , y ) è maggiore di thresh, imposta il valore del pixel dell’immagine di destinazione dst ( x , y ) a maxValue. Altrimenti, lo imposta a zero. Ecco come appare lo pseudo-codice.

# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Più in generale, ci sono molti tipi di soglia basati su diverse regole di soglia applicate a src ( x , y ) per ottenere dst ( x , y ). Vediamo i vari tipi di soglia disponibili in OpenCV.

Esempi di soglia: C++ e Python

Se hai fretta, salta alla sezione download per ottenere il codice e l’immagine di esempio.

Input Image

Negli esempi seguenti, useremo questa immagine come input. Clicca sulla figura 2 per scaricare l’immagine in formato PNG. L’immagine di input contiene numeri scritti con intensità (valore della scala di grigi) uguale al numero stesso. Per esempio, il valore del pixel del numero 200 è 200, e quello di 32 è 32. Ecco perché 32 appare molto più scuro di 200 nell’immagine.

Figura 2: Immagine di input. Clicca per aprire un PNG ad alta risoluzione in un’altra finestra

In ogni esempio, spiegheremo la regola di thresholding attraverso uno pseudo-codice, forniremo un esempio C++ e python, e l’immagine di output thresholded.

Binary Thresholding ( type = THRESH_BINARY )

Questo è il tipo più comune e più semplice di thresholding.

Regola della soglia

# 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);

Risultato della soglia binaria

La figura 3 mostra il risultato dell’applicazione della soglia binaria all’immagine di input con thresh = 0 e maxValue = 255.

Figura 3 : Soglia binaria ( thresh = 0 e maxValue = 255)

Cambiando thresh a 127 vengono rimossi tutti i numeri minori o uguali a 127.

Figura 4 : Soglia binaria ( thresh = 127 e maxValue = 255)

Cambiando maxValue a 128 si imposta il valore delle regioni sotto soglia a 128.

Figura 5: Soglia binaria con maxValue impostato a 128

Soglia binaria inversa ( tipo = THRESH_BINARY_INV )

La soglia binaria inversa è esattamente il contrario della soglia binaria. Il pixel di destinazione è impostato su zero se il pixel sorgente corrispondente è maggiore della soglia, e su maxValue, se il pixel sorgente è minore della soglia.

Regola della soglia

# 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);

Risultato della soglia binaria inversa

Notare che il risultato della soglia binaria inversa mostrato nella figura 6 è esattamente l’inverso della figura 4.

Figura 6 : Soglia binaria inversa ( thresh = 127, maxValue = 0 )

Truncate Thresholding ( type = THRESH_TRUNC )

In questo tipo di soglia, il pixel di destinazione è impostato sulla soglia ( thresh ) se il valore del pixel sorgente è maggiore della soglia. Altrimenti, è impostato sul valore del pixel sorgente. maxValue è ignorato.

Regola di soglia

# 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);

Risultato del Truncate Thresholding

La figura 7 mostra il risultato dell’applicazione del Truncate Thresholding all’immagine di input. Nota che tutti i valori sopra la soglia ( 127 ) sono impostati a 127, e tutti i valori minori o uguali a 127 sono invariati. maxValue è ignorato.

Figura 7 : Truncate thresholding (thresh = 127)

Threshold to Zero ( type = THRESH_TOZERO )

In questo tipo di thresholding, il valore del pixel di destinazione è impostato al corrispondente valore del pixel sorgente se il valore del pixel sorgente è maggiore della soglia. Altrimenti, è impostato su zero. maxValue è ignorato.

Regola della soglia

# 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);

Risultato della soglia a zero

Figura 8: Soglia a zero ( thresh = 127 )

Soglia invertita a zero ( tipo = THRESH_TOZERO_INV)

In questo tipo di soglia, il valore del pixel di destinazione è impostato a zero se il valore del pixel sorgente è maggiore della soglia. Altrimenti, viene impostato sul valore del pixel sorgente. maxValue viene ignorato.

Regola di soglia

# 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);

Risultato di Inverted Threshold to Zero

La figura 9 mostra il risultato dell’applicazione di Inverted Threshold to Zero all’immagine di input. I numeri sotto la soglia mantengono il loro valore in scala di grigi, e i numeri sopra la soglia sono 0 tranne il confine. Gli artefatti sul confine sono dovuti al fatto che i valori dei pixel al confine passano da 0 al valore del numero in pochi pixel. Quindi alcuni dei pixel di confine sono sotto la soglia.

Figura 9: Soglia invertita a zero ( thresh = 127 )

Scarica il codice e l’immagine di esempio

Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Archivi

  • Gennaio 2022
  • Dicembre 2021
  • Novembre 2021
  • Ottobre 2021
  • Settembre 2021

Meta

  • Accedi
  • Feed dei contenuti
  • Feed dei commenti
  • 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 | Tema da ThemeinProgress | Offerto orgogliosamente da WordPress