有没有一种简单的方法来使用OpenCV反转蒙版?举例来说,如果我有这样的面具:OpenCV:反转掩码?
010
111
010
我想反转,并得到这样的:
101
000
101
注:我使用的OpenCV的Python绑定,因此,虽然它可能是可能只是简单地遍历掩码中的每个元素,执行速度可能成为一个问题。
有没有一种简单的方法来使用OpenCV反转蒙版?举例来说,如果我有这样的面具:OpenCV:反转掩码?
010
111
010
我想反转,并得到这样的:
101
000
101
注:我使用的OpenCV的Python绑定,因此,虽然它可能是可能只是简单地遍历掩码中的每个元素,执行速度可能成为一个问题。
如果你有一个8位掩码,那么你应该做mask = 255 - mask
。 cv :: Mat减法运算符被重载以执行每个元素的标量减法。
对于使用255“的”值的8位掩码:
mask = cv::Mat::ones(mask.size(), mask.type()) * 255 - mask;
我,因为我仍然使用OpenCV的2.1.0我的项目之一使用这一个代替马特1M溶液。
cv2.bitwise_not(mask)
将在这里帮助
我觉得这样的事情会处理,其中输入掩码可以有不同的非零值的情况下:
cv::Mat1b inputMask = ....;
cv::Mat1b invertedMask(inputMask.rows, inputMask.cols);
std::transform(
inputMask.begin(), inputMask.end(), invertedMask.begin(),
std::logical_not<uint8_t>()
);
使用[位NOT(HTTP:// opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not)来翻转矩阵中的所有位。 – 2010-07-20 14:40:03
我可能会做一些愚蠢和错误的事情,但我不认为这是一个点点滴滴 - 不是我想要的......因为那样我最终会以'255,254,255,...'结尾。可能是因为我的面具是一个“图像”? – 2010-07-20 19:53:47
这取决于你的面具的位深度。通常掩码应该有1位的深度,这会将单个位从0翻转到1,反之亦然。您可能需要先将掩码转换为1位深度图像。 如果你有更大的位深度(例如4),那么是的,它会从“0001”翻转到“1110”以及从“0000”翻转到“1111” – 2010-07-20 21:24:54