OpenCV: инвертировать маску? - PullRequest
24 голосов
/ 16 июля 2010

Есть ли простой способ инвертировать маску с помощью OpenCV?Например, если у меня есть такая маска:

010
111
010

Я бы хотел ее инвертировать и получить:

101
000
101

Примечание: я использую Python из OpenCVпривязки, поэтому хотя можно просто зацикливать каждый элемент в маске, скорость выполнения может стать проблемой.

Ответы [ 4 ]

30 голосов
/ 12 октября 2011

Если у вас 8-битная маска, тогда вам нужно сделать mask = 255 - mask.Оператор вычитания cv :: Mat перегружен для скалярного вычитания каждого элемента.

28 голосов
/ 13 февраля 2016

cv2.bitwise_not(mask) поможет здесь

7 голосов
/ 31 марта 2013

Для 8-битной маски, используя 255 в качестве значения «on»:

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

Я использую это решение вместо решения Matt M, поскольку я все еще использую OpenCV 2.1.0 для одного из своих проектов.

0 голосов
/ 07 сентября 2016

Я думаю, что-то подобное может обработать случай, когда маска ввода может иметь различные ненулевые значения:

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

std::transform(
    inputMask.begin(), inputMask.end(), invertedMask.begin(),
    std::logical_not<uint8_t>()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...