Como siempre, Guillermo, muchas gracias por tu aportación.
Un saludo.
Entre tres chalados estamos diseñando una aplicación para medir el rango dinámico de una cámara digital, es decir la cantidad de pasos de luminosidad que es capaz de capturar su sensor. Y está mal que lo diga, pero es que estoy bajo juramento: no hay ninguna web ni herramienta comercial que en esta tarea llegue al nivel de precisión (alias frikismo inútil pero divertido) que estamos alcanzando.
La aplicación de línea de comandos, rango, se invoca con una serie de opciones parametrizables. En la primera imagen se indican exactamente los parámetros que se han usado en este ejemplo aunque hay bastantes comandos más. Para no aburrir resumo el proceso en cristiano:
- Se le suministran al programa dos fotografías, una en negro y otra saturada, para calcular con precisión los niveles de negro y saturación del sensor, valores que son clave en todo el proceso
- Además se le suministran fotos hechas sobre una carta con parches de colores de diferentes luminosidades, una para cada valor ISO que se quiera analizar
- Sobre estas imágenes se realiza una corrección geométrica para eliminar la distorsión y a continuación se hacen lecturas de Señal y Ruido en cada uno de los parches
- Recolectadas las anteriores series de valores de Señal y su correspondiente relación S/N, se obtienen por regresión las curvas de relación S/N que son la forma más potente de caracterizar el rendimiento de un sensor de imagen en lo que respecta al ruido
- Finalmente por intersección de estas curvas de relación S/N con los umbrales de relación S/N escogidos como criterio de ruido, se obtiene la cifra de rango dinámico para cada valor ISO
El programa se plantea como código libre y está escrito en C++ multiplataforma para Windows/Linux (los interesados de Mac ya se buscarán la vida). Todo el diseño de los algoritmos y prototipado se hace en R con aceleraciones C++ en partes críticas. La idea es que tenga un CLI (rango) para ser usado por línea de comandos, y dos entornos GUI con menús y manejados vía ratón, uno más ingenieril y espartano (rangoLab) y otro que llegará más tarde y pretende ser más amigable para fotógrafos y usuarios no técnicos, además de ofrecer funcionalidades más allá del puro análisis (DynaRange).
Este sería el comando utilizado para la medición:
La captura de una carta de luminosidades crecientes sobre el propio monitor. El color magenta es para ayudar a alinear los canales RAW lo que dará muestras más uniformes, y el desenfoque es para impedir que la textura de píxeles del monitor se interprete como ruido, lo que empeoraría las mediciones de rango dinámico:
La anterior carta corregida geométricamente e indicando los parches leídos que participarán en el cálculo:
Leídas las muestras de Señal y Ruido se obtiene la madre del cordero: las curvas que para cada nivel de exposición RAW proporcionan la relación S/N obtenida. Sobre ellas se mide el rango dinámico:
Esta salida gráfica es la más potente que yo haya visto publicada en ningún sitio. Se pueden mostrar los puntos con los que se calcularon las curvas, para cada uno de los 4 canales RAW (por si hubiera diferencias de rendimiento por canal; spoiler: en algunas cámaras los hay), y también el resultado combinado de todos los canales con una cifra de rango dinámico promedio. La resolución de salida puede ser brutal permitiendo formato bitmap de alta calidad con antialiasing (PNG) y también formatos vectoriales que admiten zoom infinito sin perder calidad (PDF, SVG).
Por qué una herramienta así si ya están DxOMark y Photons to Photos? Aparte del reto de algoritmia y programación:
- Porque Photons to Photos muestra cifras con una normalización que no explican. Nosotros las vamos a explicar claramente.
- Porque vamos un punto más allá en la finura del cálculo (Photons to Photos usa el nivel de negro entero informado en los metadatos, nosotros lo calculamos a partir de un RAW y empleando decimales). El nivel de negro es crítico para estimar correctamente las mediciones de ruido.
- Porque estarás midiendo el RD de tu cámara, no solo de tu modelo de cámara (una de las pruebas que nos apetece hacer es comparar el RD de dos unidades de un mismo modelo; o también comparar una unidad consigo misma en frío vs cuando está muy caliente. p.ej. tras grabar vídeo).
- El programa no solo va a servir para calcular el RD, sino para generar la propia carta a la que disparar, para calcular con precisión los niveles de negro y saturación del sensor (esto en realidad es más una curiosidad científica para el fotógrafo que un dato útil), y también planeamos que sirva para medir el rendimiento completo del sensor en cualquier circunstancia (sería llevar la curva de relación S/N hasta la saturación).
Listado completo de los comandos que vamos implementando:
Salu2!Código:C:\>rango Digital camera Dynamic Range calculation "rango" v1.0 by Juan Manuel Font (coding), Hugo Rodriguez (UI design) and Guillermo Luijk (algorithms) Usage: rango [OPTION]... [FILE]... --chart -c <DIMX W H M N> : Create test chart in PNG format ("testchart.png") with a specific resolution, format and number of patches (default DIMX=1920, W=3, H=2, M=4, N=6) --chart-colour -C <R G B invgamma> : Create test chart in PNG format ("testchart.png") ranging colours from (0,0,0) to (R,G,B) with gamma compression (default R=255, G=101, B=164, invgamma=1.4) --chart-patches -M <M N> : Read test chart decoding MxN patches over rows (M) and columns (N) (default M=4, N=6) --chart-coords -x <x1 y1 x2 y2 x3 y3 x4 y4> : Read test chart defined by 4 corners (no specific ordering needed): (x1,y1), (x2,y2), (x3,y3), (x4,y4), being (0,0) the coordinates of the top-left pixel --black-level -b <float> : Camera RAW black level --black-file -B <file> : Totally dark RAW file ideally shot at base ISO --saturation-level -s <float> : Camera RAW saturation level --saturation-file -S <file> : Totally clipped RAW file ideally shot at base ISO --input-files -i <files> : Input RAW files shot over the test chart ideally for every ISO --patch-ratio -r <float> : Relative patch width/height used to compute signal and noise readings (default=0.5) --snrthreshold-db -d <float> : SNR threshold in dB for DR calculation (default=12dB "Photographic DR") --drnormalization-mpx -m <float> : Number of Mpx for DR normalization (default=8Mpx, no normalization=per pixel DR=0Mpx) --raw-channel -w <R G1 G2 B AVG> : Specify with 0/1 boolean values for which RAW channel(s) the calculations (SNR curves, DR) will be carried out (default=0 0 0 0 1) --poly-fit -f <int 2-3> : Polynomic order to fit the SNR curve (default=3) --output-file -o <file> : Output CSV text file(s) with all results: black level, sat level, SNR samples, DR values, fitting params (default="results.csv") --plot -p <int 0-3> <PNG/PDF/SVG> : Export SNR curves plot in PNG/PDF/SVG formats with/without the CLI command that generated them (default=0, don't plot, default format=PNG) --print-patches -P <file> : Save keystone/ETTR/gamma corrected test chart in PNG format indicating the patches used for all calculations (default="printpatches.png")
Última edición por Guillermo Luijk; 04/10/25 a las 12:25:56
Como siempre, Guillermo, muchas gracias por tu aportación.
Un saludo.
Mi equipo:
No dejas de sorprender!!! Gracias por el currazo que os estáis metiendo. Habrá que probar a ver los resultados que arroja.
Hola, saludos ....rango dinámico de una cámara digital,....SONY A7III ????
Entre tres chalados estamos diseñando una aplicación para medir el rango dinámico de una cámara digital,
Rango dinámico de la Sony A7 III es de aproximadamente 15 pasos en su ISO base, gracias a su sensor CMOS Exmor R retroiluminado. Esto significa que la cámara es capaz de capturar una gran cantidad de detalle tanto en las zonas más brillantes como en las más oscuras de una imagen, ofreciendo una excelente latitud para recuperar información en la edición, especialmente en la recuperación de detalles en sombras.
Y gracias por tu interes y el de tus compañeros en el ambito de la ingenieria, siempre es de agradecer todos estos estudios, para nada "tres chalados" todo lo contrario, felicidades por ello...pero para mi que no se ingles pues he de reconocer
un poco fuera de lugar, pero
![]()
Saludos de Felipe![]()
Última edición por invierno; 05/10/25 a las 11:34:56
Gracias por vuestras palabras.
Una curiosidad sobre la Sony A7 IV. Al calcular sus curvas de relación S/N, la del canal azul del RAW sale consistentemente por encima de las de los otros 3 canales:
(en el título indica Olympus OM-1 pero es la Sony A7 IV)
Comprobado que esto no tenía su origen en alguna diferencia en cuanto al nivel de negro de ese canal (lo que también sería extraño), solo quedaban dos opciones:
- La electrónica de la cámara, por el motivo que fuera, era diferente para ese canal y le daba un punto de rendimiento extra.
- Los RAW llevan ese canal cocinado aplicándole una reducción de ruido en la propia cámara.
El segundo punto, es decir la reducción de ruido por software, suele quedar delatado al hacer la FFT (transformada de Fourier) sobre una señal de ruido puro. Si no hay reducciones de ruido aplicadas el ruido será blanco abarcando todas las frecuencias dando una FFT de color uniforme, pero si se ha aplicado algún proceso de reducción de ruido se verá algún tipo de anomalía en la FFT.
Aplicado a un RAW a ISO100 de esta Sony A7 IV queda claro que se está aplicando algún proceso al canal B que mejora su rendimiento en ruido:
Esto no es para llevarse las manos a la cabeza. Esta misma cámara lo hace para todos los canales en su ISO102400 (se ve en las curvas de arriba), y las Canon sin espejo también hacen estas travesuras. La jodienda es que cuando un fabricante aplica estas reducciones de ruido, el cálculo de rango dinámico aumenta artificialmente sin corresponder a una mejora de rendimiento real.
Salu2!
Última edición por Guillermo Luijk; 05/10/25 a las 13:13:10
Felipe; eso que escribes sobre tu Sony; es lo que dice el fabricante. Lo que Guillermo te ofrece es que averigües lo que es capaz de hacer tu cámara en concreto.
Aunque no va a cambiar nada, no creo que nadie cambie la cámara por los resultados que ofrezca el programa; es una buena forma de entretenerse y saber de qué dispones en tu cámara.
Yo de inglés se poco; pero de programación menos. Aunque le gustaría probarlo con mis cámaras, solo por curiosidad. Cuando se pueda, si me surgen dudas, le preguntaré al artífice de la criatura a ver si le apetece echarme una mano.
Una versión en plan gráfica minimalista impresa vintage del rendimiento de la Sony A7 IV.
Esta gráfica desprovista de colorines y detalle excesivo permite ver rápidamente varias cosas:
- No hay diferencia en esta cámara entre ISO50 e ISO100, disparando en RAW son a efectos prácticos la misma cosa.
- A partir de ISO400 se produce un cambio de comportamiento (Dual gain), haciendo que la degradación debida al ruido tarde más en llegar cuando se trabaja con niveles de exposición bajos.
- Relacionado con lo anterior, la curva de ISO400 llega a cruzarse con la de ISO200 lo que quiere decir que este sensor a ISO400, incluso con un paso menos de exposición, rinde mejor que a ISO200 con un paso más de luz. Esta mejora es poco utilizable en la práctica porque se da en zonas de tan baja relación S/N que normalmente ni se consideran utilizables. Pero no deja de ser curioso.
- El rango dinámico fotográfico a nivel de píxel a ISO50/ISO100 es de 11,4EV.
Salu2!
Bueno esto es en parte mockup pero el 90% de las cosas ya funcionan y el GUI va tomando esta pinta:
De izq. a derecha:
- Se suministran 2 archivos RAW darkframe y saturado para calcular los niveles de negro y saturación del sensor
- Luego los archivos RAW con las capturas de las cartas
- A la derecha parámetros del cálculo (con valores por defecto, no es preciso cambiarlos): margen de seguridad en los parches, normalización a determinada resolución (8Mpx es la que usa DxOMark), umbrales de relación S/N para los que se calcula el rango dinámico (0, 6 y 12 dB en el ejemplo), orden de los polinomios de interpolación (3 por defecto), canales RAW a estudiar
- Elementos a plotear en las curvas: scatter de valores (EV, dB), curvas de relación S/N, etiquetas con el RD
- La salida es una gráfica con una calidad brutal. Puede ser PNG (bitmap) o SVG (vectorial).
Salu2!
Va tomando forma la herramienta para medir el rango dinámico de una cámara digital, es decir la cantidad de pasos de luminosidad que es capaz de capturar su sensor.
La aplicación de línea de comandos, rango, se invoca con una serie de opciones parametrizables. El proceso a seguir es:
La aplicación de línea de comandos, rango, se invoca con una serie de opciones parametrizables. El proceso a seguir es:
- Se le suministran al programa dos fotografías, una en negro y otra saturada, para calcular con precisión los niveles de negro y saturación del sensor, valores que son clave en todo el proceso
- Además se le suministran fotos hechas sobre una carta con parches de colores de diferentes luminosidades, una para cada valor ISO que se quiera analizar
- Sobre estas imágenes se realiza una corrección geométrica para eliminar la distorsión y a continuación se hacen lecturas de Señal y Ruido en cada uno de los parches
- Recolectadas las anteriores series de valores de Señal y su correspondiente relación S/N, se obtienen por regresión las curvas de relación S/N que son la forma más potente de caracterizar el rendimiento de un sensor de imagen en lo que respecta al ruido
- Finalmente por intersección de estas curvas de relación S/N con los umbrales de relación S/N escogidos como criterio de ruido, se obtiene la cifra de rango dinámico para cada valor ISO
El GUI está por pulir pero ya implementa de forma gráfica todas las funciones disponibles por línea de comandos. La detección de parches puede ser automática o manual. La salida en forma de curvas de relación S/N es configurable desde el máximo de información (scatter, curvas y rango dinámico de los 4 canales RAW a la vez), a una versión tan minimalista como se quiera, siempre con alta calidad en formato bitmap de alta resolución (PNG) o vectorial (SVG). El procesado completo de 10 archivos RAW, uno para cada ISO de la cámara, se realiza en aprox. 7s en un ordenador estándar.
Salu2!
Última edición por Guillermo Luijk; 20/10/25 a las 10:32:12
MEDICIÓN DE LA REDUCCIÓN DE RUIDO Y LA MEJORA DE RANGO DINÁMICO CON EL APILADO POR MEDIA
Otro ejercicio para poner a prueba el algorismo. La teoría dicta que cuando se promedian cuatro distribuciones normales con los mismos parámetros de media y varianza, la desviación estandar se reduce a la mitad. Aplicado a señales con ruido, esto significa que la relación S/N de una imagen se duplica (o lo que es lo mismo, el ruido visible se reduce a la mitad) si promediamos 4 versiones incorreladas de la misma.
Esto es de aplicación en fotografía para obtener imágenes más limpias cuando nos podemos permitir usar un trípode: se repite la misma foto varias veces y se promedian todas las tomas.
He calculado la mejora obtenida en la curva de relación S/N cuando hacemos un apilado de 4 tomas y otro de 16 tomas. Las nuevas curvas debieran ser gemelas de la curva S/N original pero desplazadas hacia arriba en 6dB (=20*log10(2)) y 12dB (=20*log10(4)) respectivamente, lo que equivale a reducciones de ruido a la mitad y a la 1/4 parte del original.
En las sombras profundas, donde la estadística gaussiana queda destruida por la cuantización que supone tener muy pocos niveles, la mejora no llega a esos 12dB (ver que la separación entre las curvas se hace menor a 12dB):
En realidad esto es irrelevante porque son zonas no utilizables en fotografía. Donde el fotógrafo trabaja la mejora sí alcanza los 12dB. Visualmente una mejora en ruido de 12dB equivale a lo que puede verse en este apilado de Mazinger Z:
De las curvas anteriores puede verse que con los apilados logramos un aumento de rango dinámico muy notable: ganamos 1,2EV de RD con el apilado de 4 fotos y 2,0EV apilando 16 fotos.
El proceso como siempre consiste en hacer fotos a una cartar de parches:
Corregir su geometría detectando automáticamente las esquinas:
Y hacer la lectura de valores de señal y ruido:
Salu2!
Marcadores