OpenCV Threshold ( Python , C++ )
Il Gennaio 4, 2022 da adminChe 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.
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.
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.
Cambiando thresh a 127 vengono rimossi tutti i numeri minori o uguali a 127.
Cambiando maxValue a 128 si imposta il valore delle regioni sotto soglia 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.
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.
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
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.
Lascia un commento