2012-05-15 12 views

risposta

9

Alcune funzioni permettono di passare mask argomenti a loro. Per creare maschere il modo in cui lei descrive, penso che tu sia dopo Cmp or CmpS che sono operatori di confronto, che consente di creare maschere, in confronto ad un altro array o scalare. Per esempio:

im = cv.LoadImageM('tree.jpg', cv.CV_LOAD_IMAGE_GRAYSCALE) 
mask_im = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1) 
#Here we create a mask by using `greater than 100` as our comparison 
cv.CmpS(im, 100, mask_im, cv.CV_CMP_GT) 
#We set all values in im to 255, apart from those masked, cv.Set can take a mask arg. 
cv.Set(im, 255, mask=mask_im) 
cv.ShowImage("masked", im) 
cv.WaitKey(0) 

originale im:

enter image description here

im dopo l'elaborazione:

enter image description here

+0

Grazie! esattamente quello che stavo cercando :) –

3

OpenCV C++ supporta la seguente sintassi si potrebbe trovare conveniente nel maschere creando:

Mat B= A > 1;//B(A<1)=0 

o

Mat B = A==10; 
B *= c; 

che dovrebbe essere equivalente a:

B=zeros(size(A)); 
B(A==10)=c; 

È anche possibile utilizzare compare(). Vedere il seguente OpenCV Documentation.

+1

Avreste idea del perché il risultato di (matrice == 1) si tradurrebbe in quei valori che sono 1 nella matrice di origine essendo 255 nella matrice di uscita? –

+0

OpenCV ha un concetto chiamato mascheramento. La convenzione è che una maschera binaria è implementata usando i caratteri 0-> 0 e 1-> 255. Quindi la risposta migliore è che 255 viene reindirizzato per nessun motivo speciale diverso dalla convenzione. Si noti che quando si utilizza una maschera nelle funzioni OPenCV non è necessario attenersi a questa convenzione. Qualsiasi numero compreso tra 1-255 è vero e 0 è falso. –

+0

Grazie! Sì, mi rendo conto che 255 valuterà come vero, ma in MATLAB è comune sommare gli 1 nell'output della matrice binaria. Ero confuso dal fatto che stavo ottenendo numeri enormi perché tutti erano 255. Lo terrò a mente. Grazie ancora. –

Problemi correlati