web-dev-qa-db-fra.com

OpenCV: Inverser un masque?

Existe-t-il un moyen simple d'inverser un masque à l'aide d'OpenCV? Par exemple, si j'ai un masque comme celui-ci:

010
111
010

Je voudrais l'inverser et obtenir ceci:

101
000
101

Remarque: j'utilise les liaisons Python d'OpenCV. Par conséquent, bien qu'il soit possible de simplement passer en boucle sur chaque élément du masque, la vitesse d'exécution risque de poser problème.

24
David Wolever

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.

30
Matt Montag

cv2.bitwise_not(mask) aiderait ici

25
Rikesh Subedi

Pour un masque de 8 bits utilisant 255 comme valeur "on":

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

J'utilise celle-ci à la place de la solution Matt M, car j'utilise toujours OpenCV 2.1.0 pour l'un de mes projets.

7
Andres Hurtis

Je pense que quelque chose comme ceci pourrait gérer le cas où le masque de saisie peut avoir diverses 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>()
);
0
Owen