2017-04-02 1 views
0

Étant donné une image multicanal (par exemple BGR), quel est le moyen le plus efficace de générer un masque (binaire) 1C pour l'égalité des valeurs de pixel?Génération d'un masque à un seul canal

cv::compare() fonctionne uniquement pour les images d'entrée à un seul canal. L'utilisation de op== donne 3C.
Je peux alors reduce cela, mais cela semble être une deuxième passe inutile.

Existe-t-il un moyen unique de faire cela?

Répondre

2

Pour les matrices multicanaux, vous devez utiliser cv::inRange(), qui prend les images monocanal, 3 canaux ou 4 canaux comme src et prend les limites inférieure et supérieure des couleurs à segmenter. Puisque vous voulez tester l'égalité d'une couleur donnée, vous devez passer les deux lower_bound et upper_bound comme la même valeur scalaire.

cv::Scalar color = cv::Scalar(100, 200, 150); 
cv::Mat mask; 
cv::inRange(img, color, color, mask); 
+1

Ah! J'ai oublié cette fonction! Merci! –

+0

Pour être complet, voici un lien des derniers documents: http://docs.opencv.org/3.2.0/d2/de8/group__core__array.html#ga48af0ab51e36436c5d04340e036ce981. –