[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:
/**
* 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:
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:
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