Author Topic: [PJSR] Evaluating the effective dynamic range of an image  (Read 10872 times)

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
[PJSR] Evaluating the effective dynamic range of an image
« on: 2007 December 18 13:05:45 »
[Texto en Español abajo]

Pedro Pastor (Alicante University) has raised me an interesting question today: how could we evaluate the effective dynamic ranges provided by DSLR RAW images? The answer to this question is a good way to evaluate the dynamic ranges provided by different DSLR cameras. Of course, such evaluation can be performed for any kind of digital image, including CDD and film images.

I've written a small script that allows us to answer this excellent question in PixInsight:

Code: [Select]
/**
 * Effective dynamic range by histogram quantization.
 */

//
// This script can evaluate ranges not larger than MAX_RANGE.
// To evaluate ranges smaller than the 16-bit range, set MAX_RANGE to 65536 below.
// This will speed up calculation considerably, and will require much less
// memory than the default value.
//
#define MAX_RANGE 10000000

function CountValues( image )
{
   for ( var c = 0; c < image.numberOfChannels; ++c )
   {
      // Generate a 16-bit histogram for the current channel
      var H = new Histogram( MAX_RANGE );
      image.selectedChannel = c;
      H.generate( image );

      // Count the number of nonzero histogram levels
      var N = 0;
      for ( var i = 0; i < MAX_RANGE; ++i )
         if ( H.count( i ) != 0 )
            ++N;
      console.writeln( format( "   %2d   | %8u | %5.2f |", c, N, Math.log2( N ) ) );
      console.flush();
   }

   image.resetSelections();
}

function main()
{
   // Get access to the currently active image window.
   var window = ImageWindow.activeWindow;

   // Do we have one?
   if ( window.isNull )
      throw Error( "There is no active image window!" );

   console.show();
   console.writeln( "Calculating effective dynamic range..." );
   console.writeln( "<b>", window.currentView.fullId, "</b>" );
   console.writeln( "Channel |   Values |  Bits |" );
   console.writeln( "--------|----------|-------|" );
   console.flush();

   CountValues( window.currentView.image );
}

main();


This script implements a technique that is conceptually simple but very efficient to carry out the required task: quantization. The script generates a discrete histogram with sufficient resolution (the resolution of a histogram is the number of discrete levels in the histogram). Then the script counts how many histogram levels have nonzero pixel counts. This count is the actual number of existing sample values in the image.

This script provides its results on the processing console. Here is a typical output:

Code: [Select]
IMG_0014
Channel |   Values |  Bits |
--------|----------|-------|
    0   |      993 |  9.96 |
    1   |     2991 | 11.55 |
    2   |     1199 | 10.23 |


The above numbers correspond to a raw image obtained with a Canon EOS 40D (courtesy of Pedro Pastor). The Channel column is the image channel index (0=red, 1=green, 2=blue). The Values column shows the total number of sample values found for each channel. Finally, the Bits column shows the effective bit depth (equal to the base 2 logarithm of the  number of sample values).

To apply this script to DSLR raw images, you must do the following before opening raw images:

     
    - Open the Format Explorer window
          - Double click on the RAW format item (left panel)
          - On the RAW Format Preferences dialog:
               
      - Both White Balance options must be disabled
                  - The "Create RAW Bayer picture" option must be selected


In this way raw images will be loaded without any interpolation, just as they have been acquired by the camera sensor.

By default, the script is able to calculate effective dynamic ranges as large as 10^7 discrete sample values. This allows us to evaluate most 32-bit images. If you only want to evaluate 16-bit images (e.g. DSLR raw images), you can set the MAX_RANGE constant to 65536 (= 2^16), which will shorten calculation times considerably.

An obvious improvement would be the automatic adaptation of the histogram's resolution to the native bit depth of the target image. This is left as an exercise :)

=========================

Pedro Pastor (Universidad de Alicante) me ha planteado hoy una interesante pregunta: ¿cómo podríamos calcular el rango dinámico efectivo proporcionado por una imagen RAW de DSLR? La respuesta a esta pregunta es una buena forma de evaluar los rangos dinámicos proporcionados por diferentes cámaras DSLR. Por supuesto, este análisis se puede aplicar a cualquier tipo de imagen digital, incluyendo imágenes obtenidas con CCD y película fotográfica.

He escrito un pequeño script que nos permite responder esta excelente pregunta en PixInsight (código fuente del script arriba).

Este script implementa una técnica que es conceptualmente simple pero muy eficiente para llevar a cabo la tarea solicitada: cuantización. El script genera un histograma discreto con suficiente resolución (la resolución de un histograma es el número de valores discretos que contiene). El script cuenta el número de niveles del histograma que tienen cuentas de píxel mayores que cero. El resultado es el número real de valores de píxel que existe en la imagen.

El script proporciona sus resultados en la consola de PixInsight. Aquí tenemos una salida típica:

Code: [Select]
IMG_0014
Channel |   Values |  Bits |
--------|----------|-------|
    0   |      993 |  9.96 |
    1   |     2991 | 11.55 |
    2   |     1199 | 10.23 |


Estos número corresponden a una imagen raw obtenida con una cámara Canon EOS 40D (cortesía de Pedro Pastor). La columna Channel es el índice de canal (0=rojo, 1=verde, 2=azul). La columna Values muestra el número de valores encontrado para cada canal. Finalmente, la columna Bits indica la profundidad efectiva en bits (igual al logaritmo en base 2 del número de valores).

Para aplicar este script a imágenes raw de DSLR hay que hacer lo siguiente antes de abrir las imágenes:

     
    - Despliega la ventana Format Explorer
          - Doble clic en el ítem correspondiente al formato RAW (panel izquierdo)
          - En la ventana RAW Format Preferences:
               
      - Ambas opciones de White Balance deben estar desactivadas
                  - Tiene que estar seleccionada la opción "Create RAW Bayer picture"


De esta forma las imágenes raw se cargarán sin ningún tipo de interpolación, tal como han sido captadas por el sensor de la cámara.

Por defecto, el script es capaz de calcular rangos dinámicos efectivos tan grandes como 10^7 valores discretos. Esto nos permite evaluar la mayoría de imágenes de 32 bits. Si sólo se desea evaluar imágenes de 16 bits, se puede establecer el valor de la constante MAX_RANGE a 65536 (= 2^16), lo cual acortará el tiempo de cálculo considerablemente.

Una mejora obvia sería la adaptación automática de la resolución del histograma a la profundidad de bits nativa de la imagen. Esto lo dejo como un ejercicio :)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
[PJSR] Evaluating the effective dynamic range of an image
« Reply #1 on: 2007 December 18 14:14:14 »
Hola Juan:
He aplicado el script a dos imágenes obtenidas esta mañana de la nevada por mi casa con mi vieja EOS 300D y he obtenido estos resultados:

Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071218/CRW_3215.CRW
Decoding Canon EOS 300D DIGITAL file (3088x2056 pixels, ISO=400, Exposure=1/181s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/Rango.js

Processing script file: C:/PCL/src/scripts/Rango.js
Calculating effective dynamic range...
CRW_3215
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     6542 | 12.68 |
    1   |    16301 | 13.99 |
    2   |    13427 | 13.71 |


Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071218/CRW_3224.CRW
Decoding Canon EOS 300D DIGITAL file (3088x2056 pixels, ISO=400, Exposure=1/181s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/Rango.js

Processing script file: C:/PCL/src/scripts/Rango.js
Calculating effective dynamic range...
CRW_3224
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     6159 | 12.59 |
    1   |    15759 | 13.94 |
    2   |    12731 | 13.64 |

Me he quedado sorprendido de los resultados obtenidos.
¿Es posible que se alcancen valores tan elevados?.

Saludos.

Editado:
He probado con una de las exposiciones con el gran angular de la zona del Holmes obtenidas el día 14, con la 400d modificada y los resultados han sido estos:

Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071214/Holmes/Previos/IMG_3939.CR2
Decoding Canon EOS 400D DIGITAL file (3906x2602 pixels, ISO=400, Exposure=180s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/Rango.js

Processing script file: C:/PCL/src/scripts/Rango.js
Calculating effective dynamic range...
IMG_3939
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     3372 | 11.72 |
    1   |     4182 | 12.03 |
    2   |     3459 | 11.76 |

¿es posible que la 400d obtenga un menor rango?
Saludos de nuevo.
Saludos.

Manolo L.

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
[PJSR] Evaluating the effective dynamic range of an image
« Reply #2 on: 2007 December 18 23:17:43 »
Hola Manolo

No, por supuesto que no son reales esos valores tan altos (lo siento...  :) )

Se me olvidó decir (ahora lo corrijo) que para aplicar este script a imágenes raw de DSLR con matriz de Bayer hay que hacer lo siguiente antes de abrir las imágenes:

    - Despliega la ventana Format Explorer
    - Doble clic en el ítem correspondiente al formato RAW (panel izquierdo)
    - En la ventana RAW Format Preferences:
      - Ambas opciones de White Balance deben estar desactivadas
      - Tiene que estar seleccionada la opción "Create RAW Bayer picture"


De esta forma las imágenes raw se abrirán sin ningún tipo de interpolación, tal como han sido captadas por el sensor de la cámara.

Ahora ya puedes abrir las imágenes y ejecutar el script. Mejor que cambies el valor de MAX_RANGE a 65536 para acelerar el funcionamiento del script.

Cuando hayas acabado de evaluar las imágenes, deberías volver a cambiar las opciones de RAW Format Preferences para cargar las imágenes debayerizadas (Interpolation > Bilinear).
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
[PJSR] Evaluating the effective dynamic range of an image
« Reply #3 on: 2007 December 19 00:43:39 »
Hola de nuevo Juan:

Efectivamente ajustando los parámetros como has indicado los Bits del rango disminuyen sensiblemente.
Esta prueba esta realizada con una imagen diurna tomada hace unos momentos con la 400d y se ha realizado primero sin los ajustes y después con ellos, ya así el rango en los canales se sitúa entre 9 y 10 bits

Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071218/IMG_3989.CR2
Decoding Canon EOS 400D DIGITAL file (3906x2602 pixels, ISO=400, Exposure=1/83s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/Rango.js

Processing script file: C:/PCL/src/scripts/Rango.js
Calculating effective dynamic range...
IMG_3989
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     4275 | 12.06 |
    1   |     7319 | 12.84 |
    2   |     5027 | 12.30 |



Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071218/IMG_3989.CR2
Decoding Canon EOS 400D DIGITAL file (3906x2602 pixels, ISO=400, Exposure=1/83s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/RangoDSLR.js

Processing script file: C:/PCL/src/scripts/RangoDSLR.js
Calculating effective dynamic range...
IMG_3989
Channel |   Values |  Bits |
--------|----------|-------|
    0   |      663 |  9.37 |
    1   |      945 |  9.88 |
    2   |      781 |  9.61 |



He repetido la prueba aplicando los ajustes a una de las imagenes obtenida con la 300d ayer y en la que obtuve estos valores:

Channel | Values | Bits |
--------|----------|-------|
0         |  6542 | 12.68 |
1        | 16301 | 13.99 |
2        | 13427 | 13.71 |


los valores como era de esperar y como ha pasado con la imagen de la 400d han disminuido, pero son bastante superiores a los que he obtenido con el modelo más moderno:

Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071218/CRW_3215.CRW
Decoding Canon EOS 300D DIGITAL file (3088x2056 pixels, ISO=400, Exposure=1/181s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/RangoDSLR.js

Processing script file: C:/PCL/src/scripts/RangoDSLR.js
Calculating effective dynamic range...
CRW_3215
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     1028 | 10.01 |
    1   |     2296 | 11.16 |
    2   |     2140 | 11.06 |


¿Será posible que Canon haya retrocedido en captación de rango en sus nuevos modelos con respecto a los antiguos?.

Saludos.
Saludos.

Manolo L.

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
[PJSR] Evaluating the effective dynamic range of an image
« Reply #4 on: 2007 December 19 00:52:47 »
Interesante comparación  8)

Tienes que tener en cuenta que el script evalúa el número de valores que hay en una imagen. Esto quiere decir que para establecer una comparación válida entre dos cámaras habría que comparar imágenes del mismo sujeto obtenidas en idénticas condiciones.

Es probable que la imagen de la 300D que has probado haya explotado mejor las capacidades de la cámara, respecto a la imagen de la 400D.

Hombre, yo no creo que la 400D proporcione rangos menores que la 300D. No tendría mucho sentido. Lo que habría que hacer es probar con un número grande de imágenes en igualdad de condiciones para obtener una estadística fiable.

En principio, la imagen ideal para este script es una que represente un rango de iluminación lo más amplio posible, desde las sobras hasta las altas luces.
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
[PJSR] Evaluating the effective dynamic range of an image
« Reply #5 on: 2007 December 19 00:56:59 »
Otra cosa. Si te fijas, siempre se obtienen valores superiores para el canal verde. ¿Por qué? Muy sencillo, porque en la matriz de Bayer hay el doble de elementos verdes que rojos y azules. Por tanto, la probabilidad de que tengamos un mayor número de valores numéricos en el verde es mayor  :)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
[PJSR] Evaluating the effective dynamic range of an image
« Reply #6 on: 2007 December 19 04:58:32 »
Hola:
Reflexionando sobre el tema y teniendo presente que para que la comparativa tuviera una cierta validez, no era lo importante el que se tomaran ambas imágenes en iguales condiciones, si no que ambas imágenes tuvieran valores en todo lo ancho del histograma y en los tres colores, he estado experimentando .
Mientras con la 300d a f:8 con un tiempo de 1/180 segundos el histograma se extendía a todo lo ancho de la escala en los tres colores, con la 400d solo el rojo llegaba al final. En esta he tenido que bajar la velocidad a 1/80 para que el verde y el azul ocupen toda la escala, asumiendo que el rojo quedará saturado, aunque a efectos de la medida no parece que tenga mucha importancia.
Aquí están dos capturas de pantalla de como quedan ambas imágenes y sus estadísticas:

EOS 300d:



EOS 400d:




Y los datos del rango dinámico de estas imagenes son los siguientes:

Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071219/CRW_3237.CRW
Decoding Canon EOS 300D DIGITAL file (3088x2056 pixels, ISO=400, Exposure=1/181s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/RangoDSLR.js

Processing script file: C:/PCL/src/scripts/RangoDSLR.js
Calculating effective dynamic range...
CRW_3237
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     1644 | 10.68 |
    1   |     3871 | 11.92 |
    2   |     3509 | 11.78 |



Reading 1 image(s):
F:/FotosNuevas/A2007/12_Diciembre/071219/IMG_3993.CR2
Decoding Canon EOS 400D DIGITAL file (3906x2602 pixels, ISO=400, Exposure=1/83s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/RangoDSLR.js

Processing script file: C:/PCL/src/scripts/RangoDSLR.js
Calculating effective dynamic range...
IMG_3993
Channel |   Values |  Bits |
--------|----------|-------|
    0   |     1453 | 10.50 |
    1   |     3793 | 11.89 |
    2   |     3072 | 11.58 |


Ya la diferencia entre ambas cámaras es mas pequeña, aunque sigue ganando la 300d.
Saludos.
Saludos.

Manolo L.