2010-07-16 109 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>() 
);