2010-07-16 120 views
21

有没有一种简单的方法来使用OpenCV反转蒙版?举例来说,如果我有这样的面具:OpenCV:反转掩码?

010 
111 
010 

我想反转,并得到这样的:

101 
000 
101 

注:我使用的OpenCV的Python绑定,因此,虽然它可能是可能只是简单地遍历掩码中的每个元素,执行速度可能成为一个问题。

+3

使用[位NOT(HTTP:// opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not)来翻转矩阵中的所有位。 – 2010-07-20 14:40:03

+0

我可能会做一些愚蠢和错误的事情,但我不认为这是一个点点滴滴 - 不是我想要的......因为那样我最终会以'255,254,255,...'结尾。可能是因为我的面具是一个“图像”? – 2010-07-20 19:53:47

+1

这取决于你的面具的位深度。通常掩码应该有1位的深度,这会将单个位从0翻转到1,反之亦然。您可能需要先将掩码转换为1位深度图像。 如果你有更大的位深度(例如4),那么是的,它会从“0001”翻转到“1110”以及从“0000”翻转到“1111” – 2010-07-20 21:24:54

回答

24

如果你有一个8位掩码,那么你应该做mask = 255 - mask。 cv :: Mat减法运算符被重载以执行每个元素的标量减法。

7

对于使用255“的”值的8位掩码:

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

我,因为我仍然使用OpenCV的2.1.0我的项目之一使用这一个代替马特1M溶液。

20

cv2.bitwise_not(mask)将在这里帮助

0

我觉得这样的事情会处理,其中输入掩码可以有不同的非零值的情况下:

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

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