2010-07-16 5 views
21

Existe-t-il un moyen simple d'inverser un masque en utilisant OpenCV? Par exemple, si j'ai un masque comme celui-ci:OpenCV: Inverser un masque?

010 
111 
010 

Je voudrais inverser et obtenir ceci:

101 
000 
101 

Note: J'utilise les liaisons Python OpenCV, donc tout il serait possible de simplement boucler sur chaque élément dans le masque, la vitesse d'exécution pourrait devenir un problème.

+3

Utilisez un [Négation binaire] (http: // opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not) pour retourner tous les bits dans une matrice. –

+0

Il est possible que je fasse quelque chose de stupide et de mal, mais je ne pense pas à un bitwite - ce n'est pas ce que je veux ... Parce que je finirai par '255,254,255, ...'. C'est peut-être parce que mon masque est un 'Image'? –

+1

Cela dépend de la profondeur de votre masque. Normalement, un masque devrait avoir une profondeur de 1 bit, ce qui ferait basculer le bit unique de 0 à 1 et inversement. Vous devrez peut-être d'abord convertir votre masque en image 1 bit. Si vous avez une plus grande profondeur de bits (ex 4), alors oui, il passerait de '0001' '1110' et de' 0000' '' 1111' –

Répondre

24

Si vous avez un masque de 8 bits, alors vous devriez faire mask = 255 - mask. L'opérateur de soustraction cv :: Mat est surchargé pour effectuer une soustraction scalaire par élément.

7

Pour un masque de 8 bits en utilisant 255 comme « sur la » valeur:

mask = cv::Mat::ones(mask.size(), mask.type()) * 255 - mask; 

J'utilise celui-ci au lieu de la solution Matt M que j'utilise encore OpenCV 2.1.0 pour un de mes projets .

20

cv2.bitwise_not(mask) contribuerait ici

0

Je pense que quelque chose comme cela pourrait gérer le cas où le masque d'entrée peut avoir différentes valeurs non nulles:

cv::Mat1b inputMask = ....; 
cv::Mat1b invertedMask(inputMask.rows, inputMask.cols); 

std::transform(
    inputMask.begin(), inputMask.end(), invertedMask.begin(), 
    std::logical_not<uint8_t>() 
);