Raw RGB desde sensor de imagen CMOS a conversión de escala de grises

Estoy tratando de producir una imagen con el sensor de imagen en color OV7740 . Hasta donde yo sé, el sensor está configurado de forma predeterminada para proporcionar datos RAW RGB paralelos de 10 bits (debido a un filtro Bayer en el chip). ¿Cómo se deben procesar/escalar estos datos para obtener datos de imagen en escala de grises?

EDITAR: Supongo que la discusión de mi problema se puede encontrar aquí .

¿Qué intentaste hasta ahora? ¿Con qué tipo de tablero estás trabajando? Hay muchos registros en esos sensores... ¿Puedes obtener esa hoja de datos? Sé que los más grandes están todos bajo NDA. Finalmente, ¿a qué lo estás conectando?
¿Has intentado usar el algoritmo normal de escala de grises?
@SomeHardwareGuy Leo la salida digital del sensor y muestro estos datos como una imagen en escala de grises de 10 bits. Espero que el sensor proporcione una salida razonable de forma predeterminada (rgb sin procesar, todos los ajustes están en modo automático), por lo que no consideré ninguno de los registros. No se puede obtener una hoja de datos. Lo conduzco con un FPGA y luego redirijo los datos a la tarjeta NI PCI para el muestreo. Por lo tanto, los datos que muestro deben procesarse para dar una imagen razonable.
@ IgnacioVazquez-Abrams Supongo que podría usarlo (creo que te refieres a escalar 0.21 R + 0.72 G + 0.07 B). Sin embargo, primero necesito convertirlo de raw rgb a rgb . Esperaba que hubiera un atajo para convertir rgb sin procesar a escala de grises, ya que los sensores ven todo en escala de grises.
Eché un vistazo al resumen del producto y afirma que puede generar YUV de 8 bits. Debería poder escalar gamma el canal Y.
@IgnacioVazquez-Abrams Eso será complicado. No tengo la óptica adecuada para enfocar una imagen en el plano del sensor. Para obtener una salida YUV de 8 bits, necesito realizar escrituras en los registros del sensor. Hacer todas estas cosas a la vez será difícil ya que no sabré qué parte del sistema no funciona correctamente. Entonces, esperaba usar los datos de salida tal como están con el procesamiento, luego crear una configuración óptica adecuada y luego intentar sobrescribir los registros para una configuración personalizada. ¿Cómo obtengo el canal Y de YUV sin formato?
Presumiblemente, extraería el byte Y del triplete YUV.
@IgnacioVazquez-Abrams No estoy seguro de lo que quieres decir con triplete . Para cada píxel obtengo solo un valor.
¿Obtienes Y, U y V en un solo byte? El peor. Cámara. Alguna vez.
@IgnacioVazquez-Abrams Probablemente. Es un sensor, no una cámara. Leí una secuencia paralela de valores de 10 bits para cada píxel. Con 640*480 píxeles, obtengo valores de datos sin procesar de 640*480 de 10 bits. Deben ser "demostrado" primero.

Respuestas (1)

Un proceso de demostración de alta calidad está lleno de sutilezas, pero se puede obtener una respuesta muy económica si se puede aceptar una pérdida del 50 % en la resolución espacial. Simplemente sume grupos de cuatro píxeles del sensor para obtener un solo píxel gris. Suponiendo que su sensor tenga un patrón de filtro Bayer "típico", habrá el doble de sensores verdes que rojos o azules. Luego, la suma de grupos cuadrados de cuatro píxeles generará Y = 2*G + R + B, lo que enfatiza demasiado el componente azul, pero para casos simples como verificar el enfoque del sistema óptico, eso no será un problema.

Entonces, para una disposición típica de píxeles que se ve así:

G R G R G R....
B G B G B G
G R G R G R
B G B G B G
.
.
.

Obtendría una salida Y para cada grupo de cuatro, con una resolución espacial más baja:

Y   Y   Y

Y   Y   Y

La implementación de esto se puede hacer en hardware (como en un FPGA) con solo la memoria suficiente para almacenar la mitad de una línea de escaneo, ya que puede sumar los píxeles de entrada en pares en la primera línea, luego en pares e incluyendo la suma de la línea anterior en cada uno. segunda linea.

También podría generar tantos píxeles Y como entradas haciendo una ventana deslizante, lo que requeriría una línea de escaneo completa de memoria en hardware.

Hacerlo "bien" implica una serie de pasos de procesamiento, pero la operación principal es aplicar filtros espaciales para estimar imágenes monocromáticas R, monocromáticas Gy Bseparadas con una resolución idéntica, teniendo cuidado de alinearlas correctamente. Dadas esas imágenes alineadas, es sencillo calcular Yen cada píxel.

Se puede encontrar una implementación de un sistema demostrativo bastante sofisticado en dcraw , que consume datos de sensores sin procesar y emite imágenes JPG. Los datos sin procesar del sensor se pueden obtener de muchas cámaras digitales de gama alta, pero generalmente están gravados por secretos comerciales que dificultan su interpretación para terceros. Coffin y su comunidad de usuarios han realizado un gran esfuerzo en la ingeniería inversa de los formatos de archivo sin procesar escritos por tales cámaras. Pero también se puede utilizar en su contexto.

Al desarrollar proyectos de cámara en el pasado, tomé píxeles sin procesar directamente de los sensores CMOS capturados en la RAM, los volqué a un archivo y pasé el archivo a través de dcraw.

El problema relacionado para una cámara prototipo es enfocar la óptica de su primer prototipo, para tener píxeles que puedan significar algo y así probar que todo funciona mostrando un JPG terminado de su banco.

El primer paso es encontrar y usar los modos de patrón de prueba en su sensor. Con eso, generalmente puede obtener patrones de referencia con contenido conocido para probar su flujo de datos y electrónica. Luego, puede cambiar a la óptica real con cierta confianza en que los píxeles sin procesar son significativos y concentrarse en lograr que la óptica le brinde una imagen enfocada.

Una técnica que usé en el pasado para una cámara basada en un soporte de lente de montura M12 fue enfocar la lente bastante decente con el soporte de lente montado en una placa de evaluación que tenía un software que proporcionaba una vista en vivo en una PC. Luego bloqueé la lente y moví todo el soporte de la lente a mi prototipo. Debido a las ligeras variaciones en la posición del sensor en relación con la PCB y el orificio de montaje, no fue perfecto, pero fue lo suficientemente bueno como para obtener una imagen reconocible.

Tienes razón. Debería hacer cálculos simples como dijiste y enfocar mi sistema. Entonces podré jugar con él con más confianza. Gracias por tu consejo.
RBerteig, realmente me gusta su respuesta, y me encantaría saber más sobre su proyecto acerca de extraer píxeles sin formato directamente de los sensores CMOS capturados en la RAM, volcarlos en un archivo y pasar el archivo a través de dcraw. Estoy tratando de entender la función y el hardware para realizar dicha tarea. Muchas gracias, se que es un tema viejo.