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
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.