ptr matrices library convertto opencv floating-point mat

matrices - opencv mat ptr



Cambiar el tipo de objeto Mat de CV_32F a CV_8U (1)

En OpenCV, si la imagen es de tipo coma flotante, solo esos píxeles se pueden visualizar usando imshow , que tiene 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 un pixel negro. Para visualizar una imagen de coma flotante, escala sus valores al rango 0.0 - 1.0 .

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

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

Si la imagen es de coma flotante de 32 bits, los valores de píxel 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 serán mapeados de 0 a 255. Si un valor es mayor que 1.0, y multiplicado por 255, será mayor que 255. De lo que será fijado 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, ya que el tipo de destino es CV_8U y el valor máximo posible es 255. Todos los valores de coma flotante se CV_8U el floor . No se realiza un mapeo automático.

Para asignar adecuadamente los valores al rango de CV_8U utilice los parámetros 3 y 4 de la función cv::Mat::convertTo , de modo que los valores se escalen antes de realizar la conversión.

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

Para escalar correctamente 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)

Traté de mostrar una imagen de tipo CV_32F usando la función imshow, pero mostró una imagen BLANCA . En la Documentation es dado que las imágenes de punto flotante se mapearán a 0-255 y se mostrarán, pero solo mostró una imagen blanca. Intenté convertirlo a CV_8U utilizando

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

hacer algún procesamiento - asignando valores flotantes a los píxeles en A

......

Mat B;

A.convertTo (B, CV_8U)

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

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