2012-05-15 13 views

Respuesta

9

Algunas funciones le permiten pasar argumentos de mask. Para crear máscaras de la manera que describe, creo que está buscando Cmp or CmpS, que son operadores de comparación, lo que le permite crear máscaras, en comparación con otra matriz o escalar. Por ejemplo:

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) 

original im:

enter image description here

im después del procesamiento:

enter image description here

+0

Gracias! exactamente lo que estaba buscando :) –

3

OpenCV C++ es compatible con la siguiente sintaxis que puede encontrar conveniente en la creación de máscaras:

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

o

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

que debe ser equivalente a:

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

También puede utilizar compare(). Consulte el siguiente OpenCV Documentation.

+1

¿Tendría alguna idea de por qué el resultado de (matriz == 1) daría como resultado que los valores que son 1 en la matriz fuente sean 255 en la matriz de salida? –

+0

OpenCV tiene un concepto llamado enmascaramiento. La convención es que una máscara binaria se implementa usando caracteres donde 0-> 0 y 1-> 255. Entonces, la mejor respuesta es que 255 se recupera sin ninguna razón especial aparte de la convención. Tenga en cuenta que al usar una máscara en las funciones de OPenCV no tiene que apegarse a esta convención. Cualquier número entre 1-255 es verdadero y 0 es falso. –

+0

¡Gracias! Sí, me doy cuenta de que 255 evaluará como verdadero, pero en MATLAB es común sumar los 1 en la salida de matriz binaria. Estaba confundido de que estaba obteniendo un gran número porque todos eran 255. Lo tendré en cuenta. Gracias de nuevo. –

Cuestiones relacionadas