2010-07-16 21 views
21

C'è un modo semplice per invertire una maschera usando OpenCV? Per esempio, se ho una maschera simile a questo:OpenCV: inverti una maschera?

010 
111 
010 

mi piacerebbe invertire e ottenere in questo modo:

101 
000 
101 

Nota: sto usando Python di OpenCV, così mentre sarebbe possibile in modo da eseguire il loop su ciascun elemento della maschera, la velocità di esecuzione potrebbe diventare un problema.

+3

utilizzare un [NOT bit a bit] (http: // opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not) per capovolgere tutti i bit in una matrice. –

+0

È possibile che io stia facendo qualcosa di stupido e sbagliato, ma non penso che sia un po 'troppo caro, non è quello che voglio ... Perché poi finirò con "255,254,255, ...". Forse è perché la mia maschera è un 'immagine'? –

+1

Dipende dalla profondità di bit della maschera. Normalmente una maschera dovrebbe avere una profondità di 1 bit, che capovolgere il singolo bit da 0 a 1 e viceversa. Potrebbe essere necessario convertire prima la maschera in un'immagine a 1 bit. Se si ha una maggiore profondità di bit (ex 4), allora si passa da '0001' a' 1110' e da '0000' a' 1111' –

risposta

24

Se si dispone di una maschera a 8 bit, è necessario eseguire mask = 255 - mask. cv :: L'operatore di sottrazione di Mat è sovraccarico per eseguire la sottrazione scalare per elemento.

7

Per una maschera a 8 bit con 255 come valore "on":

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

sto usando questo uno al posto della soluzione Matt M come sto ancora utilizzando OpenCV 2.1.0 per uno dei miei progetti .

20

cv2.bitwise_not(mask) aiuterebbe qui

0

penso che qualcosa di simile potrebbe gestire il caso in cui la maschera di input può avere diversi valori diversi da zero:

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

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