OpenCV Threshold ( Python , C++ )
On janvier 4, 2022 by adminQu’est-ce que le seuillage d’image ?
Observez attentivement l’animation ci-dessous (figure 1). Combien de chiffres voyez-vous ? La plupart d’entre vous verront les chiffres : 32 (oh oui, regardez bien), 64, 100, 128, 180, 200 et 255. Mais il y a plus dans l’image que ce que l’on voit.
Dans une seconde, vous pouvez voir la version seuillée de l’image originale. Vous remarquerez que tous les chiffres semblent complètement blancs ( c’est-à-dire qu’ils ont une valeur de niveau de gris de 255 ) et qu’il y a un chiffre 5 supplémentaire. Vous n’avez pas remarqué le chiffre 5 dans l’image originale parce que sa valeur de gris était, eh bien, 5. En fait, tous les chiffres de l’image originale ont une valeur de niveau de gris égale au chiffre. Par conséquent, 255 est le plus clair et 5 est le plus sombre.
Lire les chiffres dans l’image seuillée est bien plus facile que de lire les chiffres dans l’image originale. Sans surprise, un algorithme de reconnaissance de texte trouvera l’image seuillée dans notre exemple beaucoup plus facile à traiter que l’image originale.
En vision par ordinateur, lorsque vous rendez une tâche plus facile pour les humains, vous la rendez généralement plus facile aussi pour les algorithmes informatiques.
Tous les algorithmes de seuillage prennent une image source (src) et une valeur seuil (thresh) en entrée et produisent une image de sortie (dst) en comparant la valeur du pixel source ( x , y ) au seuil. Si src ( x , y ) > thresh , alors dst ( x , y ) se voit attribuer une certaine valeur. Sinon, dst ( x , y ) se voit attribuer une autre valeur.
La forme la plus simple de seuillage est appelée seuillage binaire. En plus de l’image source (src) et de la valeur seuil (thresh), elle prend un autre paramètre d’entrée appelé valeur maximale ( maxValue ). À chaque emplacement de pixel (x, y), il compare la valeur du pixel src ( x , y ) à thresh. Si src ( x , y ) est supérieure à thresh, il fixe la valeur du pixel de l’image de destination dst ( x , y ) à maxValue. Sinon, il la fixe à zéro. Voici à quoi ressemble le pseudo-code.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Plus généralement, il existe de nombreux types de seuillage basés sur différentes règles de seuil appliquées à src ( x , y ) pour obtenir dst ( x , y ). Examinons les différents types de seuils disponibles dans OpenCV.
Exemples de seuils : C++ et Python
Si vous êtes pressé, sautez à la section téléchargement pour obtenir le code et l’image d’exemple.
Image d’entrée
Dans les exemples suivants, nous utiliserons cette image comme entrée. Cliquez sur la figure 2 pour télécharger l’image au format PNG. L’image d’entrée contient des nombres écrits avec une intensité ( valeur en niveaux de gris ) égale au nombre lui-même. Par exemple, la valeur du pixel du nombre 200 est 200, et celle de 32 est 32. C’est pourquoi 32 apparaît beaucoup plus sombre que 200 dans l’image.
Dans chaque exemple, nous expliquerons la règle de seuillage via un pseudo-code, fournirons un exemple C++ et python, et l’image de sortie seuillée.
Seuilage binaire ( type = THRESH_BINARY )
C’est le type de seuillage le plus courant et le plus simple.
Règle de seuillage
# 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);
Résultat du seuillage binaire
La figure 3 montre le résultat de l’application du seuillage binaire à l’image d’entrée avec thresh = 0 et maxValue = 255.
Changer le thresh à 127 supprime tous les nombres inférieurs ou égaux à 127.
Changer maxValue à 128 fixe la valeur des régions seuillées à 128.
Seuil binaire inverse ( type = THRESH_BINARY_INV )
Le seuillage binaire inverse est juste l’opposé du seuillage binaire. Le pixel de destination est mis à zéro si le pixel source correspondant est supérieur au seuil, et à maxValue, si le pixel source est inférieur au seuil.
Règle de seuillage
# 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);
Résultat du seuillage binaire inverse
Notez que le résultat du seuillage binaire inverse représenté sur la figure 6 est exactement l’inverse de la figure 4.
Truncate Thresholding ( type = THRESH_TRUNC )
Dans ce type de seuillage, le pixel de destination est fixé au seuil ( thresh ) si la valeur du pixel source est supérieure au seuil. Sinon, il est défini à la valeur du pixel source. maxValue est ignoré.
Règle de seuillage
# 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);
Résultat du seuillage tronqué
La figure 7 montre le résultat de l’application du seuillage tronqué à l’image d’entrée. Notez que toutes les valeurs supérieures au seuil ( 127 ) sont définies à 127, et que toutes les valeurs inférieures ou égales à 127 sont inchangées. maxValue est ignoré.
Seuil à zéro ( type = THRESH_TOZERO )
Dans ce type de seuillage, la valeur du pixel de destination est fixée à la valeur du pixel source correspondant si la valeur du pixel source est supérieure au seuil. Sinon, elle est fixée à zéro. maxValue est ignoré.
Règle de seuillage
# 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);
Résultat du seuil à zéro
Seuil inversé à zéro ( type = THRESH_TOZERO_INV)
Dans ce type de seuillage, la valeur du pixel de destination est mise à zéro si la valeur du pixel source est supérieure au seuil. Sinon, elle est fixée à la valeur du pixel source. maxValue est ignoré.
Règle de seuillage
# 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);
Résultat du seuil inversé à zéro
La figure 9 montre le résultat de l’application du seuil inversé à zéro à l’image d’entrée. Les nombres en dessous du seuil conservent leur valeur en niveaux de gris, et les nombres au-dessus du seuil sont à 0, sauf pour la frontière. Les artefacts sur la frontière sont dus au fait que les valeurs des pixels à la frontière passent de 0 à la valeur du nombre sur quelques pixels. Donc certains des pixels de la frontière sont en dessous du seuil.
Télécharger le code et l’image d’exemple
.
Laisser un commentaire