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.
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.
cv2.bitwise_not(mask)
aiderait ici
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.
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>()
);