Cambiar el tipo de objeto Mat de CV 32F a CV 8U


Traté de mostrar una imagen de tipo CV_32F usando la función imshow pero mostraba una imagen BLANCA. En la Documentación se da que las imágenes en coma flotante se asignarán a 0-255 y se mostrarán, pero solo se mostrará una imagen en blanco.Intenté convertirlo a CV_8U usando

Mat A = Mat:: ones (300,300, CV_32FC1) * 1000;

Hacer algunos procesamientos-asignando valores flotantes a píxeles en un

......

Mat B;

A. ConvertTo (B, CV_8U)

Cuando muestro 'B' obtengo una imagen en blanco y negro, no hay tonos de gris. ¿Están los píxeles con valor flotante en un mapeado correctamente a 0-255 ? ¿Estoy haciendo algo malo?

Pocos valores en A son 1000 como inicializados y rest son algunos números de coma flotante que se asignan durante el procesamiento.

Author: Charles, 2013-01-26

1 answers

En OpenCV, si la imagen es de tipo punto flotante, entonces solo se pueden visualizar esos píxeles utilizando imshow, que tienen un valor de 0.0 a 1.0, si el valor es mayor que 1.0, se mostrará como un píxel blanco y si es menor que 0.0, se mostrará como píxel negro. Para visualizar una imagen en coma flotante, escala sus valores al rango 0.0 - 1.0.

En cuanto a la parte de conversión.... Cuando se usa con argumentos predeterminados, la función cv::Mat::convertTo simplemente crea una matriz del tipo especificado, y luego copia los valores de la matriz de origen y luego los redondea al valor más cercano posible del tipo de datos de destino. Si el valor está fuera del rango, se sujeta a los valores mínimo o máximo.

En la documentación de imshow, está escrito que:

Si la imagen es de punto flotante de 32 bits, los valores de píxeles se multiplican por 255. Es decir, el rango de valores [0,1] se asigna a [0,255].

Significa que solo los valores en el rango de 0.0 a 1.0 se asignará a 0 a 255. Si un valor es mayor que 1.0, y multiplicado por 255, será mayor que 255. Luego se sujetará al rango de CV_8U y eventualmente también se convertirá en 255.

En su ejemplo, todos los valores que son 1000, se convertirán en 255 en la matriz de destino como el tipo de destino es CV_8U y el valor máximo posible es 255. Todos los valores de coma flotante serán floored. No se realiza ninguna asignación automática.

Para asignar adecuadamente los valores a el rango de CV_8U utiliza los parámetros 3rd y 4th de la función cv::Mat::convertTo, de modo que los valores se escalan antes de que se realice la conversión.

Supongamos que la matriz A tiene valores mínimos y máximos Min y Max, donde Min!=Max.

Para escalar adecuadamente los valores de 0 a 255, puede hacer lo siguiente:

if (Min!=Max){ 
    A -= Min;
    A.convertTo(B,CV_8U,255.0/(Max-Min));
}

También puedes hacer esto directamente así:

if (Min!=Max)
    A.convertTo(B,CV_8U,255.0/(Max-Min),-255.0*Min/(Max-Min));

(editado teniendo en cuenta el comentario de zhangxaochen)

 51
Author: sgarizvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-18 08:33:54