Difference between revisions of "HDR images with Elphel cameras"

From ElphelWiki
Jump to: navigation, search
 
(7 intermediate revisions by 3 users not shown)
Line 3: Line 3:
 
For informations about HDR imaging see: [http://en.wikipedia.org/wiki/High_dynamic_range_imaging Wikipedia.org]. For informations about HDR imaging algorithms see: [http://www.debevec.org/ Debevec.org] and [http://www1.cs.columbia.edu/CAVE/ Columbia.edu].
 
For informations about HDR imaging see: [http://en.wikipedia.org/wiki/High_dynamic_range_imaging Wikipedia.org]. For informations about HDR imaging algorithms see: [http://www.debevec.org/ Debevec.org] and [http://www1.cs.columbia.edu/CAVE/ Columbia.edu].
  
 +
There are several ways how to increase the dynamic range and to achieve HDR images:
  
----
+
=Exposure Bracketing=
  
 +
==Autoexposure Daemon HDR Functions==
 +
The autoexposure daemon running in the camera can rapidly alternate between multiple exposure times, allowing a single video stream with over / under exposed sequential frames. In post, these frames can be separated into individual streams and finally combined into a single HDR sequence.
 +
This HDR-video can be recorded just like any other normal video with the harddisk-recorder, camogm or captured over the network.
  
=INTRODUCTION=
+
Due to limitations in how fast the exposure time change can be propagated to the image sensor, HDR mode works best in [[Trigger| Triggered]] mode([http://www.mail-archive.com/support-list@support.elphel.com/msg00533.html]); And by altering the http://*CameraIP*/tuneseq.php?mode=latency- page, setting the EXPOS value to "0". ([http://www.mail-archive.com/support-list@support.elphel.com/msg00492.html]).
  
In computer graphics and photography, high dynamic range imaging (HDRI) is a set of techniques that allows a greater dynamic range of exposures than normal digital imaging techniques. The intention of HDRI is to accurately represent the wide range of intensity levels found in real scenes ranging from direct sunlight to shadows.
+
Below is a parsedit url that provides quick access to the required parameters for frame sequential HDR in triggered mode:
 +
(replace the IP address with that of your camera)
  
One HDR image is composed by many LDR (''Low Dynamic Range'') images representing the same scene. Ideally the LDR images should be acquired at the same time but usually they are acquired in sequence by the same camera as fast as possible. To avoid HDR ghost artifacts and to obtain high frame rate HDR videos it's important to have a high-performance hardware available depending on the static nature of the scene.
+
http://192.168.0.8/parsedit.php?embed=0.15&title=Parameters+for+groups:+autoexposure+whiteBalance+trigger+&WB_EN&AUTOEXP_ON&TRIG&TRIG_PERIOD&EXPOS&HDR_DUR&HDR_VEXPOS
  
In order to get a HDR image, the HDRI system executes the following steps:
+
[[File:HDRTrigMode.png]]
 +
# WB_EN - set to 0 to turn off automatic white balance adjustment
 +
# AUTOEXP_ON - set to 0 to turn off automatic exposure time adjustments
 +
# TRIG - Switch from free-running-mode(default) to triggered mode:TRIG_CONDITION=0x0, set the TRIG_PERIOD, TRIG=0x4
 +
# TRIG_PERIOD - defines FPS (1/frame period; FPS = 96000000 / TRIG_PERIOD); 3840000 [decimal] for 25FPS)
 +
# EXPOS - Exposure time in µseconds (10000 = 10 ms) Note that in triggered mode not the entire frame period can be used for exposing
 +
# HDR_DUR - 0 = HDR ON, 1 = HDR ON
 +
# HDR_VEXPOS - defines the exposure difference between the 2 alternating exposure times.
  
1. acquisition of n LDR images with different exposure time;
 
  
2. computation of the n acquired images;
+
Also very handy is the "Last aquired images" link on top/bottom of the parsedit table as it shows a table of the last 9 images (total number, number per row can be altered in the URL) and the matching exposure time values. Please be aware though that mismatching parameters will lead to the exposure not alternating with each frame but every second, thirds, etc. frame while the exposure time displayed in the table will seem correct but is actually wrong.
  
3. generation of the HDR image.
+
[[File:Hdr_alternating.jpg]]
 +
==Manual Bracketing==
 +
You can do exposure bracketing manually with a PHP script. Just set exposure time -> capture a single frame -> change exposure time -> capture another image, etc.
 +
This will be slower than using the daemon but you have finer control over how many brackets you want and how big the EV steps between the brackets are, etc.
 +
This is best suited for still image recording where speed is not so much of an issue.
  
The features of the HDRI system needed to execute this cycle are:
+
=Gain Bracketing=
 
+
[[JP4 HDR]] is a special raw color format that can capture a higher dynamic range in an image without introducing any artifacts as result from combining images captured at different times (exposure bracketing). Though the post processing code to develop the images is still experimental.
1. camera exposure time must vary during the acquisition process;
 
 
 
2. a memory to temporary save the acquired images;
 
 
 
3. a quite powerful CPU for image computation.
 
 
 
An Elphel camera satisfies all these requirements and can execute HDRI algorithms in different ways.
 
 
 
 
 
----
 
 
 
 
 
=PHP PROGRAMMING=
 
(under development)
 
 
 
<pre>
 
<?php
 
echo "HDR on Elphel Camera<br />";
 
 
 
//initial parameters
 
$init_pars=array(
 
  "FLIP"=>3,  //!xy, +1 - flip-X, +2 - flipY
 
  "COLOR"=>1, //! mono - 0, color mode - 1, 2- jp4, +256 - sensor test, 512 - FPGA test
 
  "DCM_HOR"  => 1,  //! Decimation horizontal
 
  "DCM_VERT" => 1,  //! Decimation vertical
 
  "BIN_HOR"  => 1,  //! Binning horizontal
 
  "BIN_VERT" => 1,  //! Binning vertical
 
  "QUALITY"  => 100, //! JPEG quality (%)
 
  "COLOR_SATURATION_BLUE" => 100 ,
 
  "COLOR_SATURATION_RED" => 100 , 
 
  "BITS" => 8,                    //! 8-bit image mode (may be 16)
 
  "GAMMA" => 100,                  //! Gamma=100% (linear responce)
 
  "PIXEL_LOW" => 10,              //! Black level - 10 (sensor default "fat zero")
 
  "PIXEL_HIGH" => 254,            //! white level
 
  "EXPOS" =>    10,              //! whatever? (in 100usec steps)
 
  "WOI_LEFT" =>  0,                //! window left
 
  "WOI_TOP" =>  0,                //! window top
 
  "WOI_WIDTH" =>  2591,            //! window width
 
  "WOI_HEIGHT" => 1936,            //! window height
 
  "RSCALE" =>      256,            //! red/green*256 (no auto - it is inside ccam.cgi)
 
  "BSCALE" =>      256,            //! blue/green*256 (no auto - it is inside ccam.cgi)
 
  "GAINR" =>        100,            //! Red analog gain 2.0*256
 
  "GAING" =>        100,            //! Green1 (red row) analog gain 2.0*256
 
  "GAINB" =>        100,            //! Red analog gain 2.0*256
 
  "GAINGB" =>      100,            //! Green2 (blue row) analog gain 2.0*256
 
  "BAYER" =>          4            //! 0..3 - set, 4- use calcualted
 
 
 
  );
 
//exposure time setting doesn't work with 2592x1936 images!
 
 
 
if (elphel_get_state()>7) {  //! compressor is running
 
    elphel_compressor_stop(); //! stop it
 
    while (elphel_get_state()>7) ; //! just wait
 
 
 
    elphel_compressor_reset(); //! Maybe needed twice (why?)
 
    elphel_compressor_reset(); //! Maybe needed twice
 
}
 
 
 
elphel_reset_sensor();
 
 
 
elphel_set_P_arr($init_pars); //set the array of parameters
 
 
 
elphel_program_sensor(0);
 
 
 
//we need to acquire a sequence of frames with different exposure time
 
//FIRST FRAME
 
elphel_compressor_frame();
 
elphel_wait_frame();
 
 
 
//SECOND FRAME
 
elphel_set_P_value(ELPHEL_EXPOS,1000);
 
elphel_program_sensor(1); //should set exposure time but doesn't work
 
elphel_compressor_frame();
 
elphel_wait_frame();
 
 
 
//THIRD FRAME
 
elphel_set_P_value(ELPHEL_EXPOS,10000);
 
elphel_program_sensor(1); //should set exposure time but doesn't work
 
elphel_compressor_frame();
 
elphel_wait_frame();
 
 
 
//elaboration here
 
 
 
//just show last captured frame
 
echo "<a href=\"http://" . $_SERVER["SERVER_ADDR"] . ":8081/last/save/wait/img\"><img src=\"http://" . $_SERVER["SERVER_ADDR"] . ":8081/last/save/wait/img\" /></a>";
 
 
 
?>
 
</pre>
 
 
 
----
 
 
 
=FPGA ALGORITHM=
 
 
 
 
 
----
 
 
 
 
 
=Post-processing=
 

Latest revision as of 09:18, 23 January 2012

The purpose of this project is to get HDR images using an Elphel camera.

For informations about HDR imaging see: Wikipedia.org. For informations about HDR imaging algorithms see: Debevec.org and Columbia.edu.

There are several ways how to increase the dynamic range and to achieve HDR images:

Exposure Bracketing

Autoexposure Daemon HDR Functions

The autoexposure daemon running in the camera can rapidly alternate between multiple exposure times, allowing a single video stream with over / under exposed sequential frames. In post, these frames can be separated into individual streams and finally combined into a single HDR sequence. This HDR-video can be recorded just like any other normal video with the harddisk-recorder, camogm or captured over the network.

Due to limitations in how fast the exposure time change can be propagated to the image sensor, HDR mode works best in Triggered mode([1]); And by altering the http://*CameraIP*/tuneseq.php?mode=latency- page, setting the EXPOS value to "0". ([2]).

Below is a parsedit url that provides quick access to the required parameters for frame sequential HDR in triggered mode: (replace the IP address with that of your camera)

http://192.168.0.8/parsedit.php?embed=0.15&title=Parameters+for+groups:+autoexposure+whiteBalance+trigger+&WB_EN&AUTOEXP_ON&TRIG&TRIG_PERIOD&EXPOS&HDR_DUR&HDR_VEXPOS

HDRTrigMode.png

  1. WB_EN - set to 0 to turn off automatic white balance adjustment
  2. AUTOEXP_ON - set to 0 to turn off automatic exposure time adjustments
  3. TRIG - Switch from free-running-mode(default) to triggered mode:TRIG_CONDITION=0x0, set the TRIG_PERIOD, TRIG=0x4
  4. TRIG_PERIOD - defines FPS (1/frame period; FPS = 96000000 / TRIG_PERIOD); 3840000 [decimal] for 25FPS)
  5. EXPOS - Exposure time in µseconds (10000 = 10 ms) Note that in triggered mode not the entire frame period can be used for exposing
  6. HDR_DUR - 0 = HDR ON, 1 = HDR ON
  7. HDR_VEXPOS - defines the exposure difference between the 2 alternating exposure times.


Also very handy is the "Last aquired images" link on top/bottom of the parsedit table as it shows a table of the last 9 images (total number, number per row can be altered in the URL) and the matching exposure time values. Please be aware though that mismatching parameters will lead to the exposure not alternating with each frame but every second, thirds, etc. frame while the exposure time displayed in the table will seem correct but is actually wrong.

Hdr alternating.jpg

Manual Bracketing

You can do exposure bracketing manually with a PHP script. Just set exposure time -> capture a single frame -> change exposure time -> capture another image, etc. This will be slower than using the daemon but you have finer control over how many brackets you want and how big the EV steps between the brackets are, etc. This is best suited for still image recording where speed is not so much of an issue.

Gain Bracketing

JP4 HDR is a special raw color format that can capture a higher dynamic range in an image without introducing any artifacts as result from combining images captured at different times (exposure bracketing). Though the post processing code to develop the images is still experimental.