En visión artificial, ¿cómo importa el tipo de datos?

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).

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

  1. ¿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.
  2. 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.
  3. ¿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

Los enteros de 8 bits sin signo son la convención de tipo de datos utilizada para casi todas las imágenes durante 30 (?) Años. Esto se debe en parte a que la mayoría de las imágenes se crean con cámaras CCD, que tienen 3 sensores: rojo, verde, azul, que producen valores que se asignan casi directamente a los 3 píxeles en la pantalla de la computadora. Debido a que las cámaras y los monitores han evolucionado para hablar el mismo idioma, el modelo de tres colores uint8 es dominante, por lo que RGB está representado por tres valores sin signo de 8 bits (24 bits) que abarcan el tono, la saturación y la intensidad de una imagen. (HSI es otro modelo de color en el que cada píxel se describe utilizando tres variables int sin signo diferentes).

Definitivamente, hay momentos en los que desea representar imágenes utilizando valores distintos de RGB. Los flotadores conservan la precisión cuando necesita ajustar imágenes repetidamente o con detalles más finos que los enteros de RGB. Pero puede lograr mucho con tres enteros de 8 bits con signo, así que no se preocupe demasiado por sus limitaciones. Hay mucha teoría detrás de generar los valores RGB de una imagen que la cámara solo se ocupa de ti. Vale la pena entender esto mejor en algún momento, pero en mi humilde opinión, no ahora.

En resumen, si necesita un número negativo, convierta su imagen a un tipo de datos que admita negativos. Si necesita mayor precisión, use un flotador. Matlab (y su caja de herramientas de procesamiento de imágenes) proporciona varias funciones integradas que convierten de uint8 a flotante, o de RGB a escala de grises. Úsalos según sea necesario.

More Interesting

¿Cómo financió China sus proyectos de investigación civil y de defensa antes del milagro económico chino de 1991?

¿Cuáles son los diversos campos en los que se superponen la física y la informática?

¿Cuáles son algunos de los algoritmos más importantes?

¿Qué tan prestigioso es publicar en NIPS?

¿Cuál es el contexto de los algoritmos de transmisión en la ciencia de datos?

¿Debería preocuparme si podría terminar mi doctorado a tiempo?

¿Cuáles son algunas de las ventajas de usar modelos de proceso gaussianos frente a redes neuronales?

¿Es importante tener experiencia en investigación específica de CS para admisiones a escuelas de posgrado de CS?

¿Cuáles son las principales diferencias entre una idea de investigación y una idea producible en informática?

¿Representando materiales de mundos 3D utilizando datos químicos?

¿Cuáles son algunos temas de investigación en ingeniería informática?

Computación de alto rendimiento: ¿Cuáles son las principales diferencias en las clases de problemas que pueden acelerarse de manera efectiva utilizando GPGPU (por ejemplo, CUDA), multiprocesamiento simétrico (por ejemplo, OpenMP) y paso de mensajes (por ejemplo, MPI) respectivamente?

¿Cuáles son algunas preguntas de investigación de doctorado en el campo del "proceso de ciencia de datos"?

¿Cuáles son algunos temas candentes en la investigación en nanotecnología?

¿Hay algún buen tema de investigación en arquitectura de computadoras que involucre programación para mostrar resultados finales?