Hola Goh chi! Ahora soy estudiante de doctorado en Visión por Computadora, ¡y solía estar rodeado por el mismo tipo de preguntas!
Creo que es importante comprender primero el “principio” de visualizar una matriz 2D (o mostrar una imagen). Para simplificar, hablemos de imágenes grises.
Para visualizar una matriz 2D SIEMPRE necesita escalar y mapear su matriz en el rango [0, 255] antes de mostrarla. 0 es siempre el más oscuro, 255 es siempre el más brillante. Eso es lo que supondrá una función / programa / software típico de visualización de imágenes (por ejemplo, cv :: imshow en OpenCV).
- Visión por computadora: ¿Por qué los mejores artículos rara vez son los más citados?
- ¿Es esta revista de investigación (IJCSIT) genuina o fraudulenta? ¿Como saber?
- ¿Cuáles son los mejores temas de investigación relacionados con la ciencia de datos?
- ¿Qué campo de investigación en Ciencias de la Computación puede perseguir un graduado que no sea CS que trabaje en TI?
- ¿La entropía de la web es de solo 22 bits?
O puede decirle al programa de visualización de imágenes cuál desea que sea el valor más oscuro (por ejemplo, -4.0) y cuál le gustaría que sea el valor más brillante (por ejemplo, 142.4). Luego, el programa de visualización de imágenes (por ejemplo, imshow en MATLAB) escalará automáticamente el intervalo [-4.0, 142.4] a [0, 255] por usted. Si no le dice su valor más oscuro y brillante, solo asumirá los valores más oscuros y brillantes predeterminados para usted (por lo general, 0 y 255 para CHAR SIN FIRMAR, 0.0 y 1.0 para FLOTANTE).
¿Por qué un programa de visualización de imágenes hace cosas así? Porque lo que los ojos humanos perciben es brillo, ahora valores. Para visualizar valores, debe asignar los valores al brillo. Usar 256 valores de [0, 255] para representar 256 niveles de brillo es un estándar de facto, porque de esa manera es conveniente almacenar el brillo de píxeles en un solo byte, y también porque los ojos humanos apenas pueden distinguir más de 256 niveles grises
- ¿Es este tipo de comportamiento esperado / deseado?
RESPUESTA: Depende del propósito de su programa. Si desea reducir el brillo general de una imagen de sobreexposición restando todos los píxeles por un valor de, digamos 30, entonces se desea este tipo de comportamiento. Sin embargo, si desea visualizar la fuerza de los bordes en una imagen restando los valores de los píxeles vecinos (que pueden dar lugar a valores negativos), entonces este tipo de comportamiento no es deseable. En su lugar, debe usar INT o FLOAT para mantener la imagen y asignar el resultado (que contiene valores negativos) a [0, 255] antes de mostrarlo. - En ese caso, ¿se deben usar flotantes para todas las manipulaciones / algoritmos de imágenes?
RESPUESTA: También depende del propósito del algoritmo. Simplemente use los tipos de datos que no darán como resultado un desbordamiento o subflujo de valores de píxeles intermedios durante las ejecuciones de su algoritmo. Algunas veces CHAR SIN FIRMAR será suficiente, algunas veces CORTO / SIN FIRMAR CORTO, a veces INT / INT NO FIRMADO, algunas veces FLOTANTE. - ¿Cómo se debe “mostrar la imagen”?
Primero, determine a qué corresponden sus valores más oscuros y más brillantes (supongamos que son minVal, maxVal de manera representativa).
Segundo, mapee y escale la imagen por imgScaled = 255 * (img – minVal) / (maxVal – minVal). Asegúrese de utilizar un tipo de datos que no se desborde o desborde durante esta operación para mantener las imágenes.
Tercero, convierta imgScaled al tipo CHAR SIN FIRMAR y muéstrelo mediante una función / programa de visualización de imágenes