2010-07-16 82 views
21

Có cách nào đơn giản để đảo ngược mặt nạ bằng OpenCV không? Ví dụ, nếu tôi đã có một mặt nạ như thế này:OpenCV: Đảo ngược mặt nạ?

010 
111 
010 

Tôi muốn nghịch nó và có được điều này:

101 
000 
101 

Lưu ý: Tôi đang sử dụng bindings Python OpenCV, vì vậy khi nó sẽ là có thể chỉ đơn giản là lặp qua từng phần tử trong mặt nạ, tốc độ thực thi có thể trở thành một vấn đề.

+3

Sử dụng [Bitwise Không] (http: // opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not) để lật tất cả các bit trong một ma trận. –

+0

Có thể tôi đang làm điều gì đó ngu ngốc và sai, nhưng tôi không nghĩ rằng một chút không phải là những gì tôi muốn ... Bởi vì sau đó tôi sẽ kết thúc với '255,254,255, ...'. Có thể bởi vì mặt nạ của tôi là một 'Hình ảnh'? –

+1

Nó phụ thuộc vào độ sâu bit của mặt nạ của bạn. Thông thường một mặt nạ phải có độ sâu 1 bit, sẽ lật ngược một chút từ 0 đến 1 và ngược lại. Bạn có thể cần phải chuyển đổi mặt nạ của mình thành hình ảnh sâu 1 bit trước. Nếu bạn có độ sâu bit lớn hơn (ví dụ 4), thì có nó sẽ lật từ '0001' sang' 1110' và từ '0000' sang' 1111' –

Trả lời

24

Nếu bạn có mặt nạ 8 bit, thì bạn nên làm mask = 255 - mask. cv :: Toán tử trừ mat bị quá tải để thực hiện phép trừ vô hướng cho từng phần tử.

7

Đối với một mặt nạ 8 bit sử dụng 255 là "trên" giá trị:

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

Tôi đang sử dụng cái này thay vì Matt M giải pháp như tôi vẫn đang sử dụng OpenCV 2.1.0 cho một trong những dự án của tôi .

20

cv2.bitwise_not(mask) sẽ giúp đây

0

Tôi nghĩ rằng một cái gì đó như thế này có thể xử lý các trường hợp mặt nạ đầu vào có thể có nhiều giá trị khác không:

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

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