SONY IMX585 - Improve dynamic range with libargus API

Hello everyone,

I’m looking to improve the dynamic range of the images captured with a SONY IMX585 sensor on an NVIDIA Jetson TX2 (JetPack 4.6), using the libargus API.

We cannot utilize the HDR features of the sensor, as our driver doesn’t support them currently, so I’m looking for different ways. We are operating the sensor in a 12 bit mode to get the most information we can.

I stumbled upon the setToneMapCurve() function from the libargus API which allows me to set a curve of 129 values for each color channel. I extended the argus_camera example to include this functionality, which also worked without a problem. However, I fail to understand at what stage of the ISP processing pipeline this curve is applied and how to utilize it best.

  • Does the tone mapping happen before or after the data is converted to 8 bit by the ISP
  • How would a curve look like which improves the dynamic range? (e.g S-curve, gamma correction curve)
  • Are there other/better ways to improve dynamic range with the libargus API

I’m grateful for all hints you can give me.

Best regards and thanks for your help

hello mrorelmy,

please refer to MMAPI developer guide, Argus::IAutoControlSettings::setToneMapCurve.
may I also know what’s the actual use-case for improving dynamic range?
do you have examples to demonstrate the scene?

Hello JerryChang,

thank you for your quick reply.

The use case is an outdoor camera system, which must be able to operate under different illumination situations (dark scenes during morning/evening, bright sunny scenes, etc.). If the sun is shining brightly, some details in the brighter image regions are lost due to saturation. Or in case of a dark scene, some darker details are lost.

As the RAW images are captured with a high bit depth of 12 bit, our idea was to apply a nonlinear LUT with the setToneMapCurve() function to improve the visibility of details in dark and bright areas. We don’t know however if the LUT is applied before or after the conversion to 8 bit by the ISP. If it happens after the conversion to 8 bit, we already lost a lot of information that we can’t get back.

I already checked the documentation for the setToneMapCurve() function and implemented it accordingly. It’s working fine basically, but we still lack the understanding when the LUT is applied.

Best regards

hello mrorelmy,

ToneMap curve is applied before color space conversion, AKA. convert to 8-bit for YUV display.

Hello JerryChang,

thanks for the clarification. That helps us a lot.
I marked your answer as solution.

Thank you and best regards

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.