Подтвердить что ты не робот

OpenCV: инвертировать маску?

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

010
111
010

Я хотел бы инвертировать его и получить следующее:

101
000
101

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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