[libcamera-devel] ipa: raspberrypi: Add a "scientific" tuning for the IMX477
diff mbox series

Message ID 20221216135903.17446-1-naush@raspberrypi.com
State Accepted
Commit bf66a1d25162350a66444e0398cc2d5f90c26e10
Headers show
Series
  • [libcamera-devel] ipa: raspberrypi: Add a "scientific" tuning for the IMX477
Related show

Commit Message

Naushir Patuck Dec. 16, 2022, 1:59 p.m. UTC
Add a tuning file for the IMX477 more suited to scientific applications.
The key differences from the original tuning file are:

- Disable ALSC block completely
- Pure rec709 gamma curve, and no contrast enhance
- New CT curve and CCMs based on the illumination spectrum of a black body
radiator up to about 3600 K and the CIE illuminant D for higher color
temperatures.

Further details on the changes can be found at:
https://forums.raspberrypi.com/viewtopic.php?t=343449

All credit for these changes go to Dr. Rolf Henkel.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>
---
 .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
 src/ipa/raspberrypi/data/meson.build          |   1 +
 2 files changed, 483 insertions(+)
 create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json

Comments

David Plowman Dec. 16, 2022, 2:08 p.m. UTC | #1
Hi Naush, Rolf

Thank you for this contribution!

On Fri, 16 Dec 2022 at 13:59, Naushir Patuck via libcamera-devel
<libcamera-devel@lists.libcamera.org> wrote:
>
> Add a tuning file for the IMX477 more suited to scientific applications.
> The key differences from the original tuning file are:
>
> - Disable ALSC block completely
> - Pure rec709 gamma curve, and no contrast enhance
> - New CT curve and CCMs based on the illumination spectrum of a black body
> radiator up to about 3600 K and the CIE illuminant D for higher color
> temperatures.
>
> Further details on the changes can be found at:
> https://forums.raspberrypi.com/viewtopic.php?t=343449
>
> All credit for these changes go to Dr. Rolf Henkel.
>
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>

Reviewed-by: David Plowman <david.plowman@raspberrypi.com>

Best regards

David

> ---
>  .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
>  src/ipa/raspberrypi/data/meson.build          |   1 +
>  2 files changed, 483 insertions(+)
>  create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json
>
> diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json
> new file mode 100755
> index 000000000000..17c4ed0a5e74
> --- /dev/null
> +++ b/src/ipa/raspberrypi/data/imx477_scientific.json
> @@ -0,0 +1,482 @@
> +{
> +    "version": 2.0,
> +    "target": "bcm2835",
> +    "algorithms": [
> +        {
> +            "rpi.black_level":
> +            {
> +                "black_level": 4096
> +            }
> +        },
> +        {
> +            "rpi.dpc": { }
> +        },
> +        {
> +            "rpi.lux":
> +            {
> +                "reference_shutter_speed": 27242,
> +                "reference_gain": 1.0,
> +                "reference_aperture": 1.0,
> +                "reference_lux": 830,
> +                "reference_Y": 17755
> +            }
> +        },
> +        {
> +            "rpi.noise":
> +            {
> +                "reference_constant": 0,
> +                "reference_slope": 2.767
> +            }
> +        },
> +        {
> +            "rpi.geq":
> +            {
> +                "offset": 204,
> +                "slope": 0.01078
> +            }
> +        },
> +        {
> +            "rpi.sdn": { }
> +        },
> +        {
> +            "rpi.awb":
> +            {
> +                "priors": [
> +                    {
> +                        "lux": 0,
> +                        "prior":
> +                        [
> +                            2000, 1.0,
> +                            3000, 0.0,
> +                            13000, 0.0
> +                        ]
> +                    },
> +                    {
> +                        "lux": 800,
> +                        "prior":
> +                        [
> +                            2000, 0.0,
> +                            6000, 2.0,
> +                            13000, 2.0
> +                        ]
> +                    },
> +                    {
> +                        "lux": 1500,
> +                        "prior":
> +                        [
> +                            2000, 0.0,
> +                            4000, 1.0,
> +                            6000, 6.0,
> +                            6500, 7.0,
> +                            7000, 1.0,
> +                            13000, 1.0
> +                        ]
> +                    }
> +                ],
> +                "modes":
> +                {
> +                    "auto":
> +                    {
> +                        "lo": 2500,
> +                        "hi": 8000
> +                    },
> +                    "incandescent":
> +                    {
> +                        "lo": 2500,
> +                        "hi": 3000
> +                    },
> +                    "tungsten":
> +                    {
> +                        "lo": 3000,
> +                        "hi": 3500
> +                    },
> +                    "fluorescent":
> +                    {
> +                        "lo": 4000,
> +                        "hi": 4700
> +                    },
> +                    "indoor":
> +                    {
> +                        "lo": 3000,
> +                        "hi": 5000
> +                    },
> +                    "daylight":
> +                    {
> +                        "lo": 5500,
> +                        "hi": 6500
> +                    },
> +                    "cloudy":
> +                    {
> +                        "lo": 7000,
> +                        "hi": 8600
> +                    }
> +                },
> +                "bayes": 1,
> +                "ct_curve":
> +                [
> +                    2000.0, 0.6331025775790707, 0.27424225990946915,
> +                    2200.0, 0.5696117366212947, 0.3116091368689487,
> +                    2400.0, 0.5204264653110015, 0.34892179554105873,
> +                    2600.0, 0.48148675531667223, 0.38565229719076793,
> +                    2800.0, 0.450085403501908, 0.42145684622485047,
> +                    3000.0, 0.42436130159169017, 0.45611835670028816,
> +                    3200.0, 0.40300023695527337, 0.48950766215198593,
> +                    3400.0, 0.3850520052612984, 0.5215567075837261,
> +                    3600.0, 0.36981508088230314, 0.5522397906415475,
> +                    4100.0, 0.333468007836758, 0.5909770465167908,
> +                    4600.0, 0.31196097364221376, 0.6515706327327178,
> +                    5100.0, 0.2961860409294588, 0.7068178946570284,
> +                    5600.0, 0.2842607232745885, 0.7564837749584288,
> +                    6100.0, 0.2750265787051251, 0.8006183524920533,
> +                    6600.0, 0.2677057225584924, 0.8398879225373039,
> +                    7100.0, 0.2617955199757274, 0.8746456080032436,
> +                    7600.0, 0.25693714288250125, 0.905569559506562,
> +                    8100.0, 0.25287531441063316, 0.9331696750390895,
> +                    8600.0, 0.24946601483331993, 0.9576820904825795
> +                ],
> +                "sensitivity_r": 1.05,
> +                "sensitivity_b": 1.05,
> +                "transverse_pos": 0.0238,
> +                "transverse_neg": 0.04429,
> +                "coarse_step": 0.1
> +            }
> +        },
> +        {
> +            "rpi.agc":
> +            {
> +                "metering_modes":
> +                {
> +                    "centre-weighted":
> +                    {
> +                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
> +                    },
> +                    "spot":
> +                    {
> +                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
> +                    },
> +                    "matrix":
> +                    {
> +                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> +                    }
> +                },
> +                "exposure_modes":
> +                {
> +                    "normal":
> +                    {
> +                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> +                    },
> +                    "short":
> +                    {
> +                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> +                    },
> +                    "long":
> +                    {
> +                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
> +                    }
> +                },
> +                "constraint_modes":
> +                {
> +                    "normal": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.3,
> +                                1000, 0.3
> +                            ]
> +                        }
> +                    ],
> +                    "highlight": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.3,
> +                                1000, 0.3
> +                            ]
> +                        },
> +                        {
> +                            "bound": "UPPER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.8,
> +                                1000, 0.8
> +                            ]
> +                        }
> +                    ],
> +                    "shadows": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.0,
> +                            "q_hi": 0.5,
> +                            "y_target":
> +                            [
> +                                0, 0.17,
> +                                1000, 0.17
> +                            ]
> +                        }
> +                    ]
> +                },
> +                "y_target":
> +                [
> +                    0, 0.16,
> +                    1000, 0.165,
> +                    10000, 0.17
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.contrast":
> +            {
> +                "ce_enable": 0,
> +                "gamma_curve":
> +                [
> +                    0, 0,
> +                    512, 2304,
> +                    1024, 4608,
> +                    1536, 6573,
> +                    2048, 8401,
> +                    2560, 9992,
> +                    3072, 11418,
> +                    3584, 12719,
> +                    4096, 13922,
> +                    4608, 15045,
> +                    5120, 16103,
> +                    5632, 17104,
> +                    6144, 18056,
> +                    6656, 18967,
> +                    7168, 19839,
> +                    7680, 20679,
> +                    8192, 21488,
> +                    9216, 23028,
> +                    10240, 24477,
> +                    11264, 25849,
> +                    12288, 27154,
> +                    13312, 28401,
> +                    14336, 29597,
> +                    15360, 30747,
> +                    16384, 31856,
> +                    17408, 32928,
> +                    18432, 33966,
> +                    19456, 34973,
> +                    20480, 35952,
> +                    22528, 37832,
> +                    24576, 39621,
> +                    26624, 41330,
> +                    28672, 42969,
> +                    30720, 44545,
> +                    32768, 46065,
> +                    34816, 47534,
> +                    36864, 48956,
> +                    38912, 50336,
> +                    40960, 51677,
> +                    43008, 52982,
> +                    45056, 54253,
> +                    47104, 55493,
> +                    49152, 56704,
> +                    51200, 57888,
> +                    53248, 59046,
> +                    55296, 60181,
> +                    57344, 61292,
> +                    59392, 62382,
> +                    61440, 63452,
> +                    63488, 64503,
> +                    65535, 65535
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.ccm":
> +            {
> +                "ccms": [
> +                    {
> +                        "ct": 2000,
> +                        "ccm":
> +                        [
> +                            1.5813882365848004, -0.35293683714581114, -0.27378771561617715,
> +                            -0.4347297185453639, 1.5792631087746074, -0.12102601986382337,
> +                            0.2322290578987574, -1.4382672640468128, 2.1386425781770755
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2200,
> +                        "ccm":
> +                        [
> +                            1.6322048484088305, -0.45932286857238486, -0.21373542690252198,
> +                            -0.3970719209901105, 1.5877868651467202, -0.17249380832122455,
> +                            0.20753774825903412, -1.2660673594740142, 2.005654261091916
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2400,
> +                        "ccm":
> +                        [
> +                            1.6766610071470398, -0.5447101051688111, -0.16838641107407676,
> +                            -0.3659845183388154, 1.592223692670396, -0.2127091997471162,
> +                            0.1833964516767549, -1.1339155942419321, 1.9089342978542396
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2600,
> +                        "ccm":
> +                        [
> +                            1.7161984340622154, -0.6152585785678794, -0.1331100845092582,
> +                            -0.33972082628066275, 1.5944888273736966, -0.2453979465898787,
> +                            0.1615577497676328, -1.0298684958833109, 1.8357854177422053
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2800,
> +                        "ccm":
> +                        [
> +                            1.7519307259815728, -0.6748682080165339, -0.10515169074540848,
> +                            -0.3171703484479931, 1.5955820297498486, -0.2727395854813966,
> +                            0.14230870739974305, -0.9460976023551511, 1.778709391659538
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3000,
> +                        "ccm":
> +                        [
> +                            1.7846716625128374, -0.7261240476375332, -0.08274697420358428,
> +                            -0.2975654035173307, 1.5960425637021738, -0.2961043416505157,
> +                            0.12546426281675097, -0.8773434727076518, 1.7330356805246685
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3200,
> +                        "ccm":
> +                        [
> +                            1.8150085872943436, -0.7708109672515514, -0.06469468211419174,
> +                            -0.2803468940646277, 1.596168842967451, -0.3164044170681625,
> +                            0.11071494533513807, -0.8199772290209191, 1.69572135046367
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3400,
> +                        "ccm":
> +                        [
> +                            1.8433668304932087, -0.8102060605062592, -0.05013485852801454,
> +                            -0.2650934036324084, 1.5961288492969294, -0.33427554893845535,
> +                            0.0977478941863518, -0.7714303112098978, 1.6647070820146963
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3600,
> +                        "ccm":
> +                        [
> +                            1.8700575831917468, -0.8452518300291346, -0.03842644337477299,
> +                            -0.2514794528347016, 1.5960178299141876, -0.3501774949366156,
> +                            0.08628520830733245, -0.729841503339915, 1.638553343939267
> +                        ]
> +                    },
> +                    {
> +                        "ct": 4100,
> +                        "ccm":
> +                        [
> +                            1.8988700903560716, -0.8911278803351247, -0.018848644425650693,
> +                            -0.21487101487384094, 1.599236541382614, -0.39405450457918206,
> +                            0.08251488056482173, -0.7178919368326191, 1.6267009056502704
> +                        ]
> +                    },
> +                    {
> +                        "ct": 4600,
> +                        "ccm":
> +                        [
> +                            1.960355191764125, -0.9624344812121991, -0.0017122408632169205,
> +                            -0.19444620905212898, 1.5978493736948447, -0.416727638296156,
> +                            0.06310261513271084, -0.6483790952487849, 1.5834605477213093
> +                        ]
> +                    },
> +                    {
> +                        "ct": 5100,
> +                        "ccm":
> +                        [
> +                            2.014680536961399, -1.0195930302148566, 0.007728256612638915,
> +                            -0.17751999660735496, 1.5977081555831, -0.4366085498741474,
> +                            0.04741267583041334, -0.5950327902073489, 1.5512919847321853
> +                        ]
> +                    },
> +                    {
> +                        "ct": 5600,
> +                        "ccm":
> +                        [
> +                            2.062652337917251, -1.0658386679125478, 0.011886354256281267,
> +                            -0.16319197721451495, 1.598363237584736, -0.45422061523742235,
> +                            0.03465810928795378, -0.5535454108047286, 1.5269025836946852
> +                        ]
> +                    },
> +                    {
> +                        "ct": 6100,
> +                        "ccm":
> +                        [
> +                            2.104985902038069, -1.103597868736314, 0.012503517136539277,
> +                            -0.15090797064906178, 1.5994703078166095, -0.4698414300864995,
> +                            0.02421766063474242, -0.5208922818196823, 1.5081270847783788
> +                        ]
> +                    },
> +                    {
> +                        "ct": 6600,
> +                        "ccm":
> +                        [
> +                            2.1424988751299714, -1.134760232367728, 0.010730356010435522,
> +                            -0.14021846798466234, 1.600822462230719, -0.48379204794526487,
> +                            0.015521315410496622, -0.49463630325832275, 1.4933313534840327
> +                        ]
> +                    },
> +                    {
> +                        "ct": 7100,
> +                        "ccm":
> +                        [
> +                            2.1758034100130925, -1.1607558481037359, 0.007452724895469076,
> +                            -0.13085694672641826, 1.6022648614493245, -0.4962330524084075,
> +                            0.008226943206113427, -0.4733077192319791, 1.4815336120437468
> +                        ]
> +                    },
> +                    {
> +                        "ct": 7600,
> +                        "ccm":
> +                        [
> +                            2.205529206931895, -1.1826662383072108, 0.0032019529917605167,
> +                            -0.122572009780486, 1.6037258133595753, -0.5073973734282445,
> +                            0.0020132587619863425, -0.4556590236414181, 1.471939788496745
> +                        ]
> +                    },
> +                    {
> +                        "ct": 8100,
> +                        "ccm":
> +                        [
> +                            2.232224969223067, -1.2013672897252885, -0.0016234598095482985,
> +                            -0.11518026734442414, 1.6051544769439803, -0.5174558699422255,
> +                            -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452
> +                        ]
> +                    },
> +                    {
> +                        "ct": 8600,
> +                        "ccm":
> +                        [
> +                            2.256082295891265, -1.2173210549996634, -0.0067231350481711675,
> +                            -0.10860272839843167, 1.6065150139140594, -0.5264728573611493,
> +                            -0.007952618707984149, -0.4284003574050791, 1.4574646927117558
> +                        ]
> +                    }
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.sharpen": { }
> +        },
> +        {
> +            "rpi.focus": { }
> +        }
> +    ]
> +}
> \ No newline at end of file
> diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
> index 84c1dabbec9c..5565508cf602 100644
> --- a/src/ipa/raspberrypi/data/meson.build
> +++ b/src/ipa/raspberrypi/data/meson.build
> @@ -9,6 +9,7 @@ conf_files = files([
>      'imx378.json',
>      'imx477.json',
>      'imx477_noir.json',
> +    'imx477_scientific.json',
>      'imx519.json',
>      'ov5647.json',
>      'ov5647_noir.json',
> --
> 2.25.1
>
Kieran Bingham Dec. 16, 2022, 2:25 p.m. UTC | #2
Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
> Add a tuning file for the IMX477 more suited to scientific applications.
> The key differences from the original tuning file are:
> 
> - Disable ALSC block completely
> - Pure rec709 gamma curve, and no contrast enhance
> - New CT curve and CCMs based on the illumination spectrum of a black body
> radiator up to about 3600 K and the CIE illuminant D for higher color
> temperatures.
> 
> Further details on the changes can be found at:
> https://forums.raspberrypi.com/viewtopic.php?t=343449
> 
> All credit for these changes go to Dr. Rolf Henkel.

Some very interesting investigations in that thread.

I'm curious if we'll end up with more configurations like this for each
sensor! But I really like the graphs to present what the tuning files
are doing comparitively. Much easier to grasp than a file of json
data...

No objections to this here but apart from admiring the graphs, I won't
judge the data so:

Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>


My only concern/comment would be how and where would we document the
differences between these tuning files? Would users just be expected to
try them to see ? Or would it be clear that a 'scientific' tuning file
has a specific set of properties ?

But any / all of that could be addressed later if needed I think.


> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>
> ---
>  .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
>  src/ipa/raspberrypi/data/meson.build          |   1 +
>  2 files changed, 483 insertions(+)
>  create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json
> 
> diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json
> new file mode 100755
> index 000000000000..17c4ed0a5e74
> --- /dev/null
> +++ b/src/ipa/raspberrypi/data/imx477_scientific.json
> @@ -0,0 +1,482 @@
> +{
> +    "version": 2.0,
> +    "target": "bcm2835",
> +    "algorithms": [
> +        {
> +            "rpi.black_level":
> +            {
> +                "black_level": 4096
> +            }
> +        },
> +        {
> +            "rpi.dpc": { }
> +        },
> +        {
> +            "rpi.lux":
> +            {
> +                "reference_shutter_speed": 27242,
> +                "reference_gain": 1.0,
> +                "reference_aperture": 1.0,
> +                "reference_lux": 830,
> +                "reference_Y": 17755
> +            }
> +        },
> +        {
> +            "rpi.noise":
> +            {
> +                "reference_constant": 0,
> +                "reference_slope": 2.767
> +            }
> +        },
> +        {
> +            "rpi.geq":
> +            {
> +                "offset": 204,
> +                "slope": 0.01078
> +            }
> +        },
> +        {
> +            "rpi.sdn": { }
> +        },
> +        {
> +            "rpi.awb":
> +            {
> +                "priors": [
> +                    {
> +                        "lux": 0,
> +                        "prior":
> +                        [
> +                            2000, 1.0,
> +                            3000, 0.0,
> +                            13000, 0.0
> +                        ]
> +                    },
> +                    {
> +                        "lux": 800,
> +                        "prior":
> +                        [
> +                            2000, 0.0,
> +                            6000, 2.0,
> +                            13000, 2.0
> +                        ]
> +                    },
> +                    {
> +                        "lux": 1500,
> +                        "prior":
> +                        [
> +                            2000, 0.0,
> +                            4000, 1.0,
> +                            6000, 6.0,
> +                            6500, 7.0,
> +                            7000, 1.0,
> +                            13000, 1.0
> +                        ]
> +                    }
> +                ],
> +                "modes":
> +                {
> +                    "auto":
> +                    {
> +                        "lo": 2500,
> +                        "hi": 8000
> +                    },
> +                    "incandescent":
> +                    {
> +                        "lo": 2500,
> +                        "hi": 3000
> +                    },
> +                    "tungsten":
> +                    {
> +                        "lo": 3000,
> +                        "hi": 3500
> +                    },
> +                    "fluorescent":
> +                    {
> +                        "lo": 4000,
> +                        "hi": 4700
> +                    },
> +                    "indoor":
> +                    {
> +                        "lo": 3000,
> +                        "hi": 5000
> +                    },
> +                    "daylight":
> +                    {
> +                        "lo": 5500,
> +                        "hi": 6500
> +                    },
> +                    "cloudy":
> +                    {
> +                        "lo": 7000,
> +                        "hi": 8600
> +                    }
> +                },
> +                "bayes": 1,
> +                "ct_curve":
> +                [
> +                    2000.0, 0.6331025775790707, 0.27424225990946915,
> +                    2200.0, 0.5696117366212947, 0.3116091368689487,
> +                    2400.0, 0.5204264653110015, 0.34892179554105873,
> +                    2600.0, 0.48148675531667223, 0.38565229719076793,
> +                    2800.0, 0.450085403501908, 0.42145684622485047,
> +                    3000.0, 0.42436130159169017, 0.45611835670028816,
> +                    3200.0, 0.40300023695527337, 0.48950766215198593,
> +                    3400.0, 0.3850520052612984, 0.5215567075837261,
> +                    3600.0, 0.36981508088230314, 0.5522397906415475,
> +                    4100.0, 0.333468007836758, 0.5909770465167908,
> +                    4600.0, 0.31196097364221376, 0.6515706327327178,
> +                    5100.0, 0.2961860409294588, 0.7068178946570284,
> +                    5600.0, 0.2842607232745885, 0.7564837749584288,
> +                    6100.0, 0.2750265787051251, 0.8006183524920533,
> +                    6600.0, 0.2677057225584924, 0.8398879225373039,
> +                    7100.0, 0.2617955199757274, 0.8746456080032436,
> +                    7600.0, 0.25693714288250125, 0.905569559506562,
> +                    8100.0, 0.25287531441063316, 0.9331696750390895,
> +                    8600.0, 0.24946601483331993, 0.9576820904825795
> +                ],
> +                "sensitivity_r": 1.05,
> +                "sensitivity_b": 1.05,
> +                "transverse_pos": 0.0238,
> +                "transverse_neg": 0.04429,
> +                "coarse_step": 0.1
> +            }
> +        },
> +        {
> +            "rpi.agc":
> +            {
> +                "metering_modes":
> +                {
> +                    "centre-weighted":
> +                    {
> +                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
> +                    },
> +                    "spot":
> +                    {
> +                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
> +                    },
> +                    "matrix":
> +                    {
> +                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> +                    }
> +                },
> +                "exposure_modes":
> +                {
> +                    "normal":
> +                    {
> +                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> +                    },
> +                    "short":
> +                    {
> +                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> +                    },
> +                    "long":
> +                    {
> +                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
> +                    }
> +                },
> +                "constraint_modes":
> +                {
> +                    "normal": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.3,
> +                                1000, 0.3
> +                            ]
> +                        }
> +                    ],
> +                    "highlight": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.3,
> +                                1000, 0.3
> +                            ]
> +                        },
> +                        {
> +                            "bound": "UPPER",
> +                            "q_lo": 0.98,
> +                            "q_hi": 1.0,
> +                            "y_target":
> +                            [
> +                                0, 0.8,
> +                                1000, 0.8
> +                            ]
> +                        }
> +                    ],
> +                    "shadows": [
> +                        {
> +                            "bound": "LOWER",
> +                            "q_lo": 0.0,
> +                            "q_hi": 0.5,
> +                            "y_target":
> +                            [
> +                                0, 0.17,
> +                                1000, 0.17
> +                            ]
> +                        }
> +                    ]
> +                },
> +                "y_target":
> +                [
> +                    0, 0.16,
> +                    1000, 0.165,
> +                    10000, 0.17
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.contrast":
> +            {
> +                "ce_enable": 0,
> +                "gamma_curve":
> +                [
> +                    0, 0,
> +                    512, 2304,
> +                    1024, 4608,
> +                    1536, 6573,
> +                    2048, 8401,
> +                    2560, 9992,
> +                    3072, 11418,
> +                    3584, 12719,
> +                    4096, 13922,
> +                    4608, 15045,
> +                    5120, 16103,
> +                    5632, 17104,
> +                    6144, 18056,
> +                    6656, 18967,
> +                    7168, 19839,
> +                    7680, 20679,
> +                    8192, 21488,
> +                    9216, 23028,
> +                    10240, 24477,
> +                    11264, 25849,
> +                    12288, 27154,
> +                    13312, 28401,
> +                    14336, 29597,
> +                    15360, 30747,
> +                    16384, 31856,
> +                    17408, 32928,
> +                    18432, 33966,
> +                    19456, 34973,
> +                    20480, 35952,
> +                    22528, 37832,
> +                    24576, 39621,
> +                    26624, 41330,
> +                    28672, 42969,
> +                    30720, 44545,
> +                    32768, 46065,
> +                    34816, 47534,
> +                    36864, 48956,
> +                    38912, 50336,
> +                    40960, 51677,
> +                    43008, 52982,
> +                    45056, 54253,
> +                    47104, 55493,
> +                    49152, 56704,
> +                    51200, 57888,
> +                    53248, 59046,
> +                    55296, 60181,
> +                    57344, 61292,
> +                    59392, 62382,
> +                    61440, 63452,
> +                    63488, 64503,
> +                    65535, 65535
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.ccm":
> +            {
> +                "ccms": [
> +                    {
> +                        "ct": 2000,
> +                        "ccm":
> +                        [
> +                            1.5813882365848004, -0.35293683714581114, -0.27378771561617715,
> +                            -0.4347297185453639, 1.5792631087746074, -0.12102601986382337,
> +                            0.2322290578987574, -1.4382672640468128, 2.1386425781770755
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2200,
> +                        "ccm":
> +                        [
> +                            1.6322048484088305, -0.45932286857238486, -0.21373542690252198,
> +                            -0.3970719209901105, 1.5877868651467202, -0.17249380832122455,
> +                            0.20753774825903412, -1.2660673594740142, 2.005654261091916
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2400,
> +                        "ccm":
> +                        [
> +                            1.6766610071470398, -0.5447101051688111, -0.16838641107407676,
> +                            -0.3659845183388154, 1.592223692670396, -0.2127091997471162,
> +                            0.1833964516767549, -1.1339155942419321, 1.9089342978542396
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2600,
> +                        "ccm":
> +                        [
> +                            1.7161984340622154, -0.6152585785678794, -0.1331100845092582,
> +                            -0.33972082628066275, 1.5944888273736966, -0.2453979465898787,
> +                            0.1615577497676328, -1.0298684958833109, 1.8357854177422053
> +                        ]
> +                    },
> +                    {
> +                        "ct": 2800,
> +                        "ccm":
> +                        [
> +                            1.7519307259815728, -0.6748682080165339, -0.10515169074540848,
> +                            -0.3171703484479931, 1.5955820297498486, -0.2727395854813966,
> +                            0.14230870739974305, -0.9460976023551511, 1.778709391659538
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3000,
> +                        "ccm":
> +                        [
> +                            1.7846716625128374, -0.7261240476375332, -0.08274697420358428,
> +                            -0.2975654035173307, 1.5960425637021738, -0.2961043416505157,
> +                            0.12546426281675097, -0.8773434727076518, 1.7330356805246685
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3200,
> +                        "ccm":
> +                        [
> +                            1.8150085872943436, -0.7708109672515514, -0.06469468211419174,
> +                            -0.2803468940646277, 1.596168842967451, -0.3164044170681625,
> +                            0.11071494533513807, -0.8199772290209191, 1.69572135046367
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3400,
> +                        "ccm":
> +                        [
> +                            1.8433668304932087, -0.8102060605062592, -0.05013485852801454,
> +                            -0.2650934036324084, 1.5961288492969294, -0.33427554893845535,
> +                            0.0977478941863518, -0.7714303112098978, 1.6647070820146963
> +                        ]
> +                    },
> +                    {
> +                        "ct": 3600,
> +                        "ccm":
> +                        [
> +                            1.8700575831917468, -0.8452518300291346, -0.03842644337477299,
> +                            -0.2514794528347016, 1.5960178299141876, -0.3501774949366156,
> +                            0.08628520830733245, -0.729841503339915, 1.638553343939267
> +                        ]
> +                    },
> +                    {
> +                        "ct": 4100,
> +                        "ccm":
> +                        [
> +                            1.8988700903560716, -0.8911278803351247, -0.018848644425650693,
> +                            -0.21487101487384094, 1.599236541382614, -0.39405450457918206,
> +                            0.08251488056482173, -0.7178919368326191, 1.6267009056502704
> +                        ]
> +                    },
> +                    {
> +                        "ct": 4600,
> +                        "ccm":
> +                        [
> +                            1.960355191764125, -0.9624344812121991, -0.0017122408632169205,
> +                            -0.19444620905212898, 1.5978493736948447, -0.416727638296156,
> +                            0.06310261513271084, -0.6483790952487849, 1.5834605477213093
> +                        ]
> +                    },
> +                    {
> +                        "ct": 5100,
> +                        "ccm":
> +                        [
> +                            2.014680536961399, -1.0195930302148566, 0.007728256612638915,
> +                            -0.17751999660735496, 1.5977081555831, -0.4366085498741474,
> +                            0.04741267583041334, -0.5950327902073489, 1.5512919847321853
> +                        ]
> +                    },
> +                    {
> +                        "ct": 5600,
> +                        "ccm":
> +                        [
> +                            2.062652337917251, -1.0658386679125478, 0.011886354256281267,
> +                            -0.16319197721451495, 1.598363237584736, -0.45422061523742235,
> +                            0.03465810928795378, -0.5535454108047286, 1.5269025836946852
> +                        ]
> +                    },
> +                    {
> +                        "ct": 6100,
> +                        "ccm":
> +                        [
> +                            2.104985902038069, -1.103597868736314, 0.012503517136539277,
> +                            -0.15090797064906178, 1.5994703078166095, -0.4698414300864995,
> +                            0.02421766063474242, -0.5208922818196823, 1.5081270847783788
> +                        ]
> +                    },
> +                    {
> +                        "ct": 6600,
> +                        "ccm":
> +                        [
> +                            2.1424988751299714, -1.134760232367728, 0.010730356010435522,
> +                            -0.14021846798466234, 1.600822462230719, -0.48379204794526487,
> +                            0.015521315410496622, -0.49463630325832275, 1.4933313534840327
> +                        ]
> +                    },
> +                    {
> +                        "ct": 7100,
> +                        "ccm":
> +                        [
> +                            2.1758034100130925, -1.1607558481037359, 0.007452724895469076,
> +                            -0.13085694672641826, 1.6022648614493245, -0.4962330524084075,
> +                            0.008226943206113427, -0.4733077192319791, 1.4815336120437468
> +                        ]
> +                    },
> +                    {
> +                        "ct": 7600,
> +                        "ccm":
> +                        [
> +                            2.205529206931895, -1.1826662383072108, 0.0032019529917605167,
> +                            -0.122572009780486, 1.6037258133595753, -0.5073973734282445,
> +                            0.0020132587619863425, -0.4556590236414181, 1.471939788496745
> +                        ]
> +                    },
> +                    {
> +                        "ct": 8100,
> +                        "ccm":
> +                        [
> +                            2.232224969223067, -1.2013672897252885, -0.0016234598095482985,
> +                            -0.11518026734442414, 1.6051544769439803, -0.5174558699422255,
> +                            -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452
> +                        ]
> +                    },
> +                    {
> +                        "ct": 8600,
> +                        "ccm":
> +                        [
> +                            2.256082295891265, -1.2173210549996634, -0.0067231350481711675,
> +                            -0.10860272839843167, 1.6065150139140594, -0.5264728573611493,
> +                            -0.007952618707984149, -0.4284003574050791, 1.4574646927117558
> +                        ]
> +                    }
> +                ]
> +            }
> +        },
> +        {
> +            "rpi.sharpen": { }
> +        },
> +        {
> +            "rpi.focus": { }
> +        }
> +    ]
> +}
> \ No newline at end of file
> diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
> index 84c1dabbec9c..5565508cf602 100644
> --- a/src/ipa/raspberrypi/data/meson.build
> +++ b/src/ipa/raspberrypi/data/meson.build
> @@ -9,6 +9,7 @@ conf_files = files([
>      'imx378.json',
>      'imx477.json',
>      'imx477_noir.json',
> +    'imx477_scientific.json',
>      'imx519.json',
>      'ov5647.json',
>      'ov5647_noir.json',
> -- 
> 2.25.1
>
Naushir Patuck Dec. 16, 2022, 3:09 p.m. UTC | #3
On Fri, 16 Dec 2022 at 14:25, Kieran Bingham <
kieran.bingham@ideasonboard.com> wrote:

> Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
> > Add a tuning file for the IMX477 more suited to scientific applications.
> > The key differences from the original tuning file are:
> >
> > - Disable ALSC block completely
> > - Pure rec709 gamma curve, and no contrast enhance
> > - New CT curve and CCMs based on the illumination spectrum of a black
> body
> > radiator up to about 3600 K and the CIE illuminant D for higher color
> > temperatures.
> >
> > Further details on the changes can be found at:
> > https://forums.raspberrypi.com/viewtopic.php?t=343449
> >
> > All credit for these changes go to Dr. Rolf Henkel.
>
> Some very interesting investigations in that thread.
>
> I'm curious if we'll end up with more configurations like this for each
> sensor!


I think that's entirely possible - and all part of the design with json
config
files!


> But I really like the graphs to present what the tuning files
> are doing comparitively. Much easier to grasp than a file of json
> data...
>
> No objections to this here but apart from admiring the graphs, I won't
> judge the data so:
>
> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>
>
> My only concern/comment would be how and where would we document the
> differences between these tuning files? Would users just be expected to
> try them to see ? Or would it be clear that a 'scientific' tuning file
> has a specific set of properties ?
>

At the end of the day, I think this is a choice for informed users.  We
provide
a sensible default config for visually pleasing images, but if users have a
specific application that requires something custom, we leave it to them to
switch to the appropriate tuning file that they know works for them.

Regards,
Naush


>
> But any / all of that could be addressed later if needed I think.
>
>
> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> > Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>
> > ---
> >  .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
> >  src/ipa/raspberrypi/data/meson.build          |   1 +
> >  2 files changed, 483 insertions(+)
> >  create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json
> >
> > diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json
> b/src/ipa/raspberrypi/data/imx477_scientific.json
> > new file mode 100755
> > index 000000000000..17c4ed0a5e74
> > --- /dev/null
> > +++ b/src/ipa/raspberrypi/data/imx477_scientific.json
> > @@ -0,0 +1,482 @@
> > +{
> > +    "version": 2.0,
> > +    "target": "bcm2835",
> > +    "algorithms": [
> > +        {
> > +            "rpi.black_level":
> > +            {
> > +                "black_level": 4096
> > +            }
> > +        },
> > +        {
> > +            "rpi.dpc": { }
> > +        },
> > +        {
> > +            "rpi.lux":
> > +            {
> > +                "reference_shutter_speed": 27242,
> > +                "reference_gain": 1.0,
> > +                "reference_aperture": 1.0,
> > +                "reference_lux": 830,
> > +                "reference_Y": 17755
> > +            }
> > +        },
> > +        {
> > +            "rpi.noise":
> > +            {
> > +                "reference_constant": 0,
> > +                "reference_slope": 2.767
> > +            }
> > +        },
> > +        {
> > +            "rpi.geq":
> > +            {
> > +                "offset": 204,
> > +                "slope": 0.01078
> > +            }
> > +        },
> > +        {
> > +            "rpi.sdn": { }
> > +        },
> > +        {
> > +            "rpi.awb":
> > +            {
> > +                "priors": [
> > +                    {
> > +                        "lux": 0,
> > +                        "prior":
> > +                        [
> > +                            2000, 1.0,
> > +                            3000, 0.0,
> > +                            13000, 0.0
> > +                        ]
> > +                    },
> > +                    {
> > +                        "lux": 800,
> > +                        "prior":
> > +                        [
> > +                            2000, 0.0,
> > +                            6000, 2.0,
> > +                            13000, 2.0
> > +                        ]
> > +                    },
> > +                    {
> > +                        "lux": 1500,
> > +                        "prior":
> > +                        [
> > +                            2000, 0.0,
> > +                            4000, 1.0,
> > +                            6000, 6.0,
> > +                            6500, 7.0,
> > +                            7000, 1.0,
> > +                            13000, 1.0
> > +                        ]
> > +                    }
> > +                ],
> > +                "modes":
> > +                {
> > +                    "auto":
> > +                    {
> > +                        "lo": 2500,
> > +                        "hi": 8000
> > +                    },
> > +                    "incandescent":
> > +                    {
> > +                        "lo": 2500,
> > +                        "hi": 3000
> > +                    },
> > +                    "tungsten":
> > +                    {
> > +                        "lo": 3000,
> > +                        "hi": 3500
> > +                    },
> > +                    "fluorescent":
> > +                    {
> > +                        "lo": 4000,
> > +                        "hi": 4700
> > +                    },
> > +                    "indoor":
> > +                    {
> > +                        "lo": 3000,
> > +                        "hi": 5000
> > +                    },
> > +                    "daylight":
> > +                    {
> > +                        "lo": 5500,
> > +                        "hi": 6500
> > +                    },
> > +                    "cloudy":
> > +                    {
> > +                        "lo": 7000,
> > +                        "hi": 8600
> > +                    }
> > +                },
> > +                "bayes": 1,
> > +                "ct_curve":
> > +                [
> > +                    2000.0, 0.6331025775790707, 0.27424225990946915,
> > +                    2200.0, 0.5696117366212947, 0.3116091368689487,
> > +                    2400.0, 0.5204264653110015, 0.34892179554105873,
> > +                    2600.0, 0.48148675531667223, 0.38565229719076793,
> > +                    2800.0, 0.450085403501908, 0.42145684622485047,
> > +                    3000.0, 0.42436130159169017, 0.45611835670028816,
> > +                    3200.0, 0.40300023695527337, 0.48950766215198593,
> > +                    3400.0, 0.3850520052612984, 0.5215567075837261,
> > +                    3600.0, 0.36981508088230314, 0.5522397906415475,
> > +                    4100.0, 0.333468007836758, 0.5909770465167908,
> > +                    4600.0, 0.31196097364221376, 0.6515706327327178,
> > +                    5100.0, 0.2961860409294588, 0.7068178946570284,
> > +                    5600.0, 0.2842607232745885, 0.7564837749584288,
> > +                    6100.0, 0.2750265787051251, 0.8006183524920533,
> > +                    6600.0, 0.2677057225584924, 0.8398879225373039,
> > +                    7100.0, 0.2617955199757274, 0.8746456080032436,
> > +                    7600.0, 0.25693714288250125, 0.905569559506562,
> > +                    8100.0, 0.25287531441063316, 0.9331696750390895,
> > +                    8600.0, 0.24946601483331993, 0.9576820904825795
> > +                ],
> > +                "sensitivity_r": 1.05,
> > +                "sensitivity_b": 1.05,
> > +                "transverse_pos": 0.0238,
> > +                "transverse_neg": 0.04429,
> > +                "coarse_step": 0.1
> > +            }
> > +        },
> > +        {
> > +            "rpi.agc":
> > +            {
> > +                "metering_modes":
> > +                {
> > +                    "centre-weighted":
> > +                    {
> > +                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1,
> 0, 0, 0, 0 ]
> > +                    },
> > +                    "spot":
> > +                    {
> > +                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
> 0, 0, 0, 0 ]
> > +                    },
> > +                    "matrix":
> > +                    {
> > +                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
> 1, 1, 1, 1 ]
> > +                    }
> > +                },
> > +                "exposure_modes":
> > +                {
> > +                    "normal":
> > +                    {
> > +                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
> > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> > +                    },
> > +                    "short":
> > +                    {
> > +                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
> > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> > +                    },
> > +                    "long":
> > +                    {
> > +                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
> > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
> > +                    }
> > +                },
> > +                "constraint_modes":
> > +                {
> > +                    "normal": [
> > +                        {
> > +                            "bound": "LOWER",
> > +                            "q_lo": 0.98,
> > +                            "q_hi": 1.0,
> > +                            "y_target":
> > +                            [
> > +                                0, 0.3,
> > +                                1000, 0.3
> > +                            ]
> > +                        }
> > +                    ],
> > +                    "highlight": [
> > +                        {
> > +                            "bound": "LOWER",
> > +                            "q_lo": 0.98,
> > +                            "q_hi": 1.0,
> > +                            "y_target":
> > +                            [
> > +                                0, 0.3,
> > +                                1000, 0.3
> > +                            ]
> > +                        },
> > +                        {
> > +                            "bound": "UPPER",
> > +                            "q_lo": 0.98,
> > +                            "q_hi": 1.0,
> > +                            "y_target":
> > +                            [
> > +                                0, 0.8,
> > +                                1000, 0.8
> > +                            ]
> > +                        }
> > +                    ],
> > +                    "shadows": [
> > +                        {
> > +                            "bound": "LOWER",
> > +                            "q_lo": 0.0,
> > +                            "q_hi": 0.5,
> > +                            "y_target":
> > +                            [
> > +                                0, 0.17,
> > +                                1000, 0.17
> > +                            ]
> > +                        }
> > +                    ]
> > +                },
> > +                "y_target":
> > +                [
> > +                    0, 0.16,
> > +                    1000, 0.165,
> > +                    10000, 0.17
> > +                ]
> > +            }
> > +        },
> > +        {
> > +            "rpi.contrast":
> > +            {
> > +                "ce_enable": 0,
> > +                "gamma_curve":
> > +                [
> > +                    0, 0,
> > +                    512, 2304,
> > +                    1024, 4608,
> > +                    1536, 6573,
> > +                    2048, 8401,
> > +                    2560, 9992,
> > +                    3072, 11418,
> > +                    3584, 12719,
> > +                    4096, 13922,
> > +                    4608, 15045,
> > +                    5120, 16103,
> > +                    5632, 17104,
> > +                    6144, 18056,
> > +                    6656, 18967,
> > +                    7168, 19839,
> > +                    7680, 20679,
> > +                    8192, 21488,
> > +                    9216, 23028,
> > +                    10240, 24477,
> > +                    11264, 25849,
> > +                    12288, 27154,
> > +                    13312, 28401,
> > +                    14336, 29597,
> > +                    15360, 30747,
> > +                    16384, 31856,
> > +                    17408, 32928,
> > +                    18432, 33966,
> > +                    19456, 34973,
> > +                    20480, 35952,
> > +                    22528, 37832,
> > +                    24576, 39621,
> > +                    26624, 41330,
> > +                    28672, 42969,
> > +                    30720, 44545,
> > +                    32768, 46065,
> > +                    34816, 47534,
> > +                    36864, 48956,
> > +                    38912, 50336,
> > +                    40960, 51677,
> > +                    43008, 52982,
> > +                    45056, 54253,
> > +                    47104, 55493,
> > +                    49152, 56704,
> > +                    51200, 57888,
> > +                    53248, 59046,
> > +                    55296, 60181,
> > +                    57344, 61292,
> > +                    59392, 62382,
> > +                    61440, 63452,
> > +                    63488, 64503,
> > +                    65535, 65535
> > +                ]
> > +            }
> > +        },
> > +        {
> > +            "rpi.ccm":
> > +            {
> > +                "ccms": [
> > +                    {
> > +                        "ct": 2000,
> > +                        "ccm":
> > +                        [
> > +                            1.5813882365848004, -0.35293683714581114,
> -0.27378771561617715,
> > +                            -0.4347297185453639, 1.5792631087746074,
> -0.12102601986382337,
> > +                            0.2322290578987574, -1.4382672640468128,
> 2.1386425781770755
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 2200,
> > +                        "ccm":
> > +                        [
> > +                            1.6322048484088305, -0.45932286857238486,
> -0.21373542690252198,
> > +                            -0.3970719209901105, 1.5877868651467202,
> -0.17249380832122455,
> > +                            0.20753774825903412, -1.2660673594740142,
> 2.005654261091916
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 2400,
> > +                        "ccm":
> > +                        [
> > +                            1.6766610071470398, -0.5447101051688111,
> -0.16838641107407676,
> > +                            -0.3659845183388154, 1.592223692670396,
> -0.2127091997471162,
> > +                            0.1833964516767549, -1.1339155942419321,
> 1.9089342978542396
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 2600,
> > +                        "ccm":
> > +                        [
> > +                            1.7161984340622154, -0.6152585785678794,
> -0.1331100845092582,
> > +                            -0.33972082628066275, 1.5944888273736966,
> -0.2453979465898787,
> > +                            0.1615577497676328, -1.0298684958833109,
> 1.8357854177422053
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 2800,
> > +                        "ccm":
> > +                        [
> > +                            1.7519307259815728, -0.6748682080165339,
> -0.10515169074540848,
> > +                            -0.3171703484479931, 1.5955820297498486,
> -0.2727395854813966,
> > +                            0.14230870739974305, -0.9460976023551511,
> 1.778709391659538
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 3000,
> > +                        "ccm":
> > +                        [
> > +                            1.7846716625128374, -0.7261240476375332,
> -0.08274697420358428,
> > +                            -0.2975654035173307, 1.5960425637021738,
> -0.2961043416505157,
> > +                            0.12546426281675097, -0.8773434727076518,
> 1.7330356805246685
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 3200,
> > +                        "ccm":
> > +                        [
> > +                            1.8150085872943436, -0.7708109672515514,
> -0.06469468211419174,
> > +                            -0.2803468940646277, 1.596168842967451,
> -0.3164044170681625,
> > +                            0.11071494533513807, -0.8199772290209191,
> 1.69572135046367
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 3400,
> > +                        "ccm":
> > +                        [
> > +                            1.8433668304932087, -0.8102060605062592,
> -0.05013485852801454,
> > +                            -0.2650934036324084, 1.5961288492969294,
> -0.33427554893845535,
> > +                            0.0977478941863518, -0.7714303112098978,
> 1.6647070820146963
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 3600,
> > +                        "ccm":
> > +                        [
> > +                            1.8700575831917468, -0.8452518300291346,
> -0.03842644337477299,
> > +                            -0.2514794528347016, 1.5960178299141876,
> -0.3501774949366156,
> > +                            0.08628520830733245, -0.729841503339915,
> 1.638553343939267
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 4100,
> > +                        "ccm":
> > +                        [
> > +                            1.8988700903560716, -0.8911278803351247,
> -0.018848644425650693,
> > +                            -0.21487101487384094, 1.599236541382614,
> -0.39405450457918206,
> > +                            0.08251488056482173, -0.7178919368326191,
> 1.6267009056502704
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 4600,
> > +                        "ccm":
> > +                        [
> > +                            1.960355191764125, -0.9624344812121991,
> -0.0017122408632169205,
> > +                            -0.19444620905212898, 1.5978493736948447,
> -0.416727638296156,
> > +                            0.06310261513271084, -0.6483790952487849,
> 1.5834605477213093
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 5100,
> > +                        "ccm":
> > +                        [
> > +                            2.014680536961399, -1.0195930302148566,
> 0.007728256612638915,
> > +                            -0.17751999660735496, 1.5977081555831,
> -0.4366085498741474,
> > +                            0.04741267583041334, -0.5950327902073489,
> 1.5512919847321853
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 5600,
> > +                        "ccm":
> > +                        [
> > +                            2.062652337917251, -1.0658386679125478,
> 0.011886354256281267,
> > +                            -0.16319197721451495, 1.598363237584736,
> -0.45422061523742235,
> > +                            0.03465810928795378, -0.5535454108047286,
> 1.5269025836946852
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 6100,
> > +                        "ccm":
> > +                        [
> > +                            2.104985902038069, -1.103597868736314,
> 0.012503517136539277,
> > +                            -0.15090797064906178, 1.5994703078166095,
> -0.4698414300864995,
> > +                            0.02421766063474242, -0.5208922818196823,
> 1.5081270847783788
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 6600,
> > +                        "ccm":
> > +                        [
> > +                            2.1424988751299714, -1.134760232367728,
> 0.010730356010435522,
> > +                            -0.14021846798466234, 1.600822462230719,
> -0.48379204794526487,
> > +                            0.015521315410496622, -0.49463630325832275,
> 1.4933313534840327
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 7100,
> > +                        "ccm":
> > +                        [
> > +                            2.1758034100130925, -1.1607558481037359,
> 0.007452724895469076,
> > +                            -0.13085694672641826, 1.6022648614493245,
> -0.4962330524084075,
> > +                            0.008226943206113427, -0.4733077192319791,
> 1.4815336120437468
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 7600,
> > +                        "ccm":
> > +                        [
> > +                            2.205529206931895, -1.1826662383072108,
> 0.0032019529917605167,
> > +                            -0.122572009780486, 1.6037258133595753,
> -0.5073973734282445,
> > +                            0.0020132587619863425, -0.4556590236414181,
> 1.471939788496745
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 8100,
> > +                        "ccm":
> > +                        [
> > +                            2.232224969223067, -1.2013672897252885,
> -0.0016234598095482985,
> > +                            -0.11518026734442414, 1.6051544769439803,
> -0.5174558699422255,
> > +                            -0.0033378143542219835,
> -0.4408590373867774, 1.4640252230667452
> > +                        ]
> > +                    },
> > +                    {
> > +                        "ct": 8600,
> > +                        "ccm":
> > +                        [
> > +                            2.256082295891265, -1.2173210549996634,
> -0.0067231350481711675,
> > +                            -0.10860272839843167, 1.6065150139140594,
> -0.5264728573611493,
> > +                            -0.007952618707984149, -0.4284003574050791,
> 1.4574646927117558
> > +                        ]
> > +                    }
> > +                ]
> > +            }
> > +        },
> > +        {
> > +            "rpi.sharpen": { }
> > +        },
> > +        {
> > +            "rpi.focus": { }
> > +        }
> > +    ]
> > +}
> > \ No newline at end of file
> > diff --git a/src/ipa/raspberrypi/data/meson.build
> b/src/ipa/raspberrypi/data/meson.build
> > index 84c1dabbec9c..5565508cf602 100644
> > --- a/src/ipa/raspberrypi/data/meson.build
> > +++ b/src/ipa/raspberrypi/data/meson.build
> > @@ -9,6 +9,7 @@ conf_files = files([
> >      'imx378.json',
> >      'imx477.json',
> >      'imx477_noir.json',
> > +    'imx477_scientific.json',
> >      'imx519.json',
> >      'ov5647.json',
> >      'ov5647_noir.json',
> > --
> > 2.25.1
> >
>
Laurent Pinchart Dec. 19, 2022, 10:53 p.m. UTC | #4
Hello,

On Fri, Dec 16, 2022 at 03:09:55PM +0000, Naushir Patuck wrote:
> On Fri, 16 Dec 2022 at 14:25, Kieran Bingham wrote:
> > Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
> > > Add a tuning file for the IMX477 more suited to scientific applications.
> > > The key differences from the original tuning file are:
> > >
> > > - Disable ALSC block completely
> > > - Pure rec709 gamma curve, and no contrast enhance
> > > - New CT curve and CCMs based on the illumination spectrum of a black body
> > > radiator up to about 3600 K and the CIE illuminant D for higher color
> > > temperatures.
> > >
> > > Further details on the changes can be found at:
> > > https://forums.raspberrypi.com/viewtopic.php?t=343449
> > >
> > > All credit for these changes go to Dr. Rolf Henkel.
> >
> > Some very interesting investigations in that thread.
> >
> > I'm curious if we'll end up with more configurations like this for each
> > sensor!
> 
> I think that's entirely possible - and all part of the design with json config
> files!
> 
> > But I really like the graphs to present what the tuning files
> > are doing comparitively. Much easier to grasp than a file of json
> > data...
> >
> > No objections to this here but apart from admiring the graphs, I won't
> > judge the data so:
> >
> > Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> >
> >
> > My only concern/comment would be how and where would we document the
> > differences between these tuning files? Would users just be expected to
> > try them to see ? Or would it be clear that a 'scientific' tuning file
> > has a specific set of properties ?
> 
> At the end of the day, I think this is a choice for informed users. We provide
> a sensible default config for visually pleasing images, but if users have a
> specific application that requires something custom, we leave it to them to
> switch to the appropriate tuning file that they know works for them.

Overall that makes sense to me. In this particular case, I think it
would however make sense to give applications a way to control the tone
mapping curve at runtime (including disabling contrast enhancement)
instead of having different curves specified in tuning files.

This isn't something that needs to be implemented urgently, and I'm fine
with this patch, but if we have tuning files that differed only by their
tone mapping curve, I'd get more annoyed.

> > But any / all of that could be addressed later if needed I think.
> >
> > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> > > Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>
> > > ---
> > >  .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
> > >  src/ipa/raspberrypi/data/meson.build          |   1 +
> > >  2 files changed, 483 insertions(+)
> > >  create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json
> > >
> > > diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json
> > > new file mode 100755
> > > index 000000000000..17c4ed0a5e74
> > > --- /dev/null
> > > +++ b/src/ipa/raspberrypi/data/imx477_scientific.json
> > > @@ -0,0 +1,482 @@
> > > +{
> > > +    "version": 2.0,
> > > +    "target": "bcm2835",
> > > +    "algorithms": [
> > > +        {
> > > +            "rpi.black_level":
> > > +            {
> > > +                "black_level": 4096
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.dpc": { }
> > > +        },
> > > +        {
> > > +            "rpi.lux":
> > > +            {
> > > +                "reference_shutter_speed": 27242,
> > > +                "reference_gain": 1.0,
> > > +                "reference_aperture": 1.0,
> > > +                "reference_lux": 830,
> > > +                "reference_Y": 17755
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.noise":
> > > +            {
> > > +                "reference_constant": 0,
> > > +                "reference_slope": 2.767
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.geq":
> > > +            {
> > > +                "offset": 204,
> > > +                "slope": 0.01078
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.sdn": { }
> > > +        },
> > > +        {
> > > +            "rpi.awb":
> > > +            {
> > > +                "priors": [
> > > +                    {
> > > +                        "lux": 0,
> > > +                        "prior":
> > > +                        [
> > > +                            2000, 1.0,
> > > +                            3000, 0.0,
> > > +                            13000, 0.0
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "lux": 800,
> > > +                        "prior":
> > > +                        [
> > > +                            2000, 0.0,
> > > +                            6000, 2.0,
> > > +                            13000, 2.0
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "lux": 1500,
> > > +                        "prior":
> > > +                        [
> > > +                            2000, 0.0,
> > > +                            4000, 1.0,
> > > +                            6000, 6.0,
> > > +                            6500, 7.0,
> > > +                            7000, 1.0,
> > > +                            13000, 1.0
> > > +                        ]
> > > +                    }
> > > +                ],
> > > +                "modes":
> > > +                {
> > > +                    "auto":
> > > +                    {
> > > +                        "lo": 2500,
> > > +                        "hi": 8000
> > > +                    },
> > > +                    "incandescent":
> > > +                    {
> > > +                        "lo": 2500,
> > > +                        "hi": 3000
> > > +                    },
> > > +                    "tungsten":
> > > +                    {
> > > +                        "lo": 3000,
> > > +                        "hi": 3500
> > > +                    },
> > > +                    "fluorescent":
> > > +                    {
> > > +                        "lo": 4000,
> > > +                        "hi": 4700
> > > +                    },
> > > +                    "indoor":
> > > +                    {
> > > +                        "lo": 3000,
> > > +                        "hi": 5000
> > > +                    },
> > > +                    "daylight":
> > > +                    {
> > > +                        "lo": 5500,
> > > +                        "hi": 6500
> > > +                    },
> > > +                    "cloudy":
> > > +                    {
> > > +                        "lo": 7000,
> > > +                        "hi": 8600
> > > +                    }
> > > +                },
> > > +                "bayes": 1,
> > > +                "ct_curve":
> > > +                [
> > > +                    2000.0, 0.6331025775790707, 0.27424225990946915,
> > > +                    2200.0, 0.5696117366212947, 0.3116091368689487,
> > > +                    2400.0, 0.5204264653110015, 0.34892179554105873,
> > > +                    2600.0, 0.48148675531667223, 0.38565229719076793,
> > > +                    2800.0, 0.450085403501908, 0.42145684622485047,
> > > +                    3000.0, 0.42436130159169017, 0.45611835670028816,
> > > +                    3200.0, 0.40300023695527337, 0.48950766215198593,
> > > +                    3400.0, 0.3850520052612984, 0.5215567075837261,
> > > +                    3600.0, 0.36981508088230314, 0.5522397906415475,
> > > +                    4100.0, 0.333468007836758, 0.5909770465167908,
> > > +                    4600.0, 0.31196097364221376, 0.6515706327327178,
> > > +                    5100.0, 0.2961860409294588, 0.7068178946570284,
> > > +                    5600.0, 0.2842607232745885, 0.7564837749584288,
> > > +                    6100.0, 0.2750265787051251, 0.8006183524920533,
> > > +                    6600.0, 0.2677057225584924, 0.8398879225373039,
> > > +                    7100.0, 0.2617955199757274, 0.8746456080032436,
> > > +                    7600.0, 0.25693714288250125, 0.905569559506562,
> > > +                    8100.0, 0.25287531441063316, 0.9331696750390895,
> > > +                    8600.0, 0.24946601483331993, 0.9576820904825795
> > > +                ],
> > > +                "sensitivity_r": 1.05,
> > > +                "sensitivity_b": 1.05,
> > > +                "transverse_pos": 0.0238,
> > > +                "transverse_neg": 0.04429,
> > > +                "coarse_step": 0.1
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.agc":
> > > +            {
> > > +                "metering_modes":
> > > +                {
> > > +                    "centre-weighted":
> > > +                    {
> > > +                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
> > > +                    },
> > > +                    "spot":
> > > +                    {
> > > +                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
> > > +                    },
> > > +                    "matrix":
> > > +                    {
> > > +                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> > > +                    }
> > > +                },
> > > +                "exposure_modes":
> > > +                {
> > > +                    "normal":
> > > +                    {
> > > +                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
> > > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> > > +                    },
> > > +                    "short":
> > > +                    {
> > > +                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
> > > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
> > > +                    },
> > > +                    "long":
> > > +                    {
> > > +                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
> > > +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
> > > +                    }
> > > +                },
> > > +                "constraint_modes":
> > > +                {
> > > +                    "normal": [
> > > +                        {
> > > +                            "bound": "LOWER",
> > > +                            "q_lo": 0.98,
> > > +                            "q_hi": 1.0,
> > > +                            "y_target":
> > > +                            [
> > > +                                0, 0.3,
> > > +                                1000, 0.3
> > > +                            ]
> > > +                        }
> > > +                    ],
> > > +                    "highlight": [
> > > +                        {
> > > +                            "bound": "LOWER",
> > > +                            "q_lo": 0.98,
> > > +                            "q_hi": 1.0,
> > > +                            "y_target":
> > > +                            [
> > > +                                0, 0.3,
> > > +                                1000, 0.3
> > > +                            ]
> > > +                        },
> > > +                        {
> > > +                            "bound": "UPPER",
> > > +                            "q_lo": 0.98,
> > > +                            "q_hi": 1.0,
> > > +                            "y_target":
> > > +                            [
> > > +                                0, 0.8,
> > > +                                1000, 0.8
> > > +                            ]
> > > +                        }
> > > +                    ],
> > > +                    "shadows": [
> > > +                        {
> > > +                            "bound": "LOWER",
> > > +                            "q_lo": 0.0,
> > > +                            "q_hi": 0.5,
> > > +                            "y_target":
> > > +                            [
> > > +                                0, 0.17,
> > > +                                1000, 0.17
> > > +                            ]
> > > +                        }
> > > +                    ]
> > > +                },
> > > +                "y_target":
> > > +                [
> > > +                    0, 0.16,
> > > +                    1000, 0.165,
> > > +                    10000, 0.17
> > > +                ]
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.contrast":
> > > +            {
> > > +                "ce_enable": 0,
> > > +                "gamma_curve":
> > > +                [
> > > +                    0, 0,
> > > +                    512, 2304,
> > > +                    1024, 4608,
> > > +                    1536, 6573,
> > > +                    2048, 8401,
> > > +                    2560, 9992,
> > > +                    3072, 11418,
> > > +                    3584, 12719,
> > > +                    4096, 13922,
> > > +                    4608, 15045,
> > > +                    5120, 16103,
> > > +                    5632, 17104,
> > > +                    6144, 18056,
> > > +                    6656, 18967,
> > > +                    7168, 19839,
> > > +                    7680, 20679,
> > > +                    8192, 21488,
> > > +                    9216, 23028,
> > > +                    10240, 24477,
> > > +                    11264, 25849,
> > > +                    12288, 27154,
> > > +                    13312, 28401,
> > > +                    14336, 29597,
> > > +                    15360, 30747,
> > > +                    16384, 31856,
> > > +                    17408, 32928,
> > > +                    18432, 33966,
> > > +                    19456, 34973,
> > > +                    20480, 35952,
> > > +                    22528, 37832,
> > > +                    24576, 39621,
> > > +                    26624, 41330,
> > > +                    28672, 42969,
> > > +                    30720, 44545,
> > > +                    32768, 46065,
> > > +                    34816, 47534,
> > > +                    36864, 48956,
> > > +                    38912, 50336,
> > > +                    40960, 51677,
> > > +                    43008, 52982,
> > > +                    45056, 54253,
> > > +                    47104, 55493,
> > > +                    49152, 56704,
> > > +                    51200, 57888,
> > > +                    53248, 59046,
> > > +                    55296, 60181,
> > > +                    57344, 61292,
> > > +                    59392, 62382,
> > > +                    61440, 63452,
> > > +                    63488, 64503,
> > > +                    65535, 65535
> > > +                ]
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.ccm":
> > > +            {
> > > +                "ccms": [
> > > +                    {
> > > +                        "ct": 2000,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.5813882365848004, -0.35293683714581114, -0.27378771561617715,
> > > +                            -0.4347297185453639, 1.5792631087746074,  -0.12102601986382337,
> > > +                            0.2322290578987574, -1.4382672640468128,   2.1386425781770755
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 2200,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.6322048484088305, -0.45932286857238486, -0.21373542690252198,
> > > +                            -0.3970719209901105, 1.5877868651467202, -0.17249380832122455,
> > > +                            0.20753774825903412, -1.2660673594740142, 2.005654261091916
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 2400,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.6766610071470398, -0.5447101051688111, -0.16838641107407676,
> > > +                            -0.3659845183388154, 1.592223692670396, -0.2127091997471162,
> > > +                            0.1833964516767549, -1.1339155942419321, 1.9089342978542396
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 2600,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.7161984340622154, -0.6152585785678794, -0.1331100845092582,
> > > +                            -0.33972082628066275, 1.5944888273736966, -0.2453979465898787,
> > > +                            0.1615577497676328, -1.0298684958833109, 1.8357854177422053
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 2800,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.7519307259815728, -0.6748682080165339, -0.10515169074540848,
> > > +                            -0.3171703484479931, 1.5955820297498486, -0.2727395854813966,
> > > +                            0.14230870739974305, -0.9460976023551511, 1.778709391659538
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 3000,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.7846716625128374, -0.7261240476375332, -0.08274697420358428,
> > > +                            -0.2975654035173307, 1.5960425637021738, -0.2961043416505157,
> > > +                            0.12546426281675097, -0.8773434727076518, 1.7330356805246685
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 3200,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.8150085872943436, -0.7708109672515514, -0.06469468211419174,
> > > +                            -0.2803468940646277, 1.596168842967451, -0.3164044170681625,
> > > +                            0.11071494533513807, -0.8199772290209191, 1.69572135046367
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 3400,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.8433668304932087, -0.8102060605062592, -0.05013485852801454,
> > > +                            -0.2650934036324084, 1.5961288492969294, -0.33427554893845535,
> > > +                            0.0977478941863518, -0.7714303112098978, 1.6647070820146963
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 3600,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.8700575831917468, -0.8452518300291346, -0.03842644337477299,
> > > +                            -0.2514794528347016, 1.5960178299141876, -0.3501774949366156,
> > > +                            0.08628520830733245, -0.729841503339915, 1.638553343939267
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 4100,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.8988700903560716, -0.8911278803351247, -0.018848644425650693,
> > > +                            -0.21487101487384094, 1.599236541382614, -0.39405450457918206,
> > > +                            0.08251488056482173, -0.7178919368326191, 1.6267009056502704
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 4600,
> > > +                        "ccm":
> > > +                        [
> > > +                            1.960355191764125, -0.9624344812121991, -0.0017122408632169205,
> > > +                            -0.19444620905212898, 1.5978493736948447, -0.416727638296156,
> > > +                            0.06310261513271084, -0.6483790952487849, 1.5834605477213093
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 5100,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.014680536961399, -1.0195930302148566, 0.007728256612638915,
> > > +                            -0.17751999660735496, 1.5977081555831, -0.4366085498741474,
> > > +                            0.04741267583041334, -0.5950327902073489, 1.5512919847321853
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 5600,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.062652337917251, -1.0658386679125478, 0.011886354256281267,
> > > +                            -0.16319197721451495, 1.598363237584736, -0.45422061523742235,
> > > +                            0.03465810928795378, -0.5535454108047286, 1.5269025836946852
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 6100,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.104985902038069, -1.103597868736314, 0.012503517136539277,
> > > +                            -0.15090797064906178, 1.5994703078166095, -0.4698414300864995,
> > > +                            0.02421766063474242, -0.5208922818196823, 1.5081270847783788
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 6600,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.1424988751299714, -1.134760232367728, 0.010730356010435522,
> > > +                            -0.14021846798466234, 1.600822462230719, -0.48379204794526487,
> > > +                            0.015521315410496622, -0.49463630325832275, 1.4933313534840327
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 7100,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.1758034100130925, -1.1607558481037359, 0.007452724895469076,
> > > +                            -0.13085694672641826, 1.6022648614493245, -0.4962330524084075,
> > > +                            0.008226943206113427, -0.4733077192319791, 1.4815336120437468
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 7600,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.205529206931895, -1.1826662383072108, 0.0032019529917605167,
> > > +                            -0.122572009780486, 1.6037258133595753, -0.5073973734282445,
> > > +                            0.0020132587619863425, -0.4556590236414181, 1.471939788496745
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 8100,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.232224969223067, -1.2013672897252885, -0.0016234598095482985,
> > > +                            -0.11518026734442414, 1.6051544769439803, -0.5174558699422255,
> > > +                            -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452
> > > +                        ]
> > > +                    },
> > > +                    {
> > > +                        "ct": 8600,
> > > +                        "ccm":
> > > +                        [
> > > +                            2.256082295891265, -1.2173210549996634, -0.0067231350481711675,
> > > +                            -0.10860272839843167, 1.6065150139140594, -0.5264728573611493,
> > > +                            -0.007952618707984149, -0.4284003574050791, 1.4574646927117558
> > > +                        ]
> > > +                    }
> > > +                ]
> > > +            }
> > > +        },
> > > +        {
> > > +            "rpi.sharpen": { }
> > > +        },
> > > +        {
> > > +            "rpi.focus": { }
> > > +        }
> > > +    ]
> > > +}
> > > \ No newline at end of file
> > > diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
> > > index 84c1dabbec9c..5565508cf602 100644
> > > --- a/src/ipa/raspberrypi/data/meson.build
> > > +++ b/src/ipa/raspberrypi/data/meson.build
> > > @@ -9,6 +9,7 @@ conf_files = files([
> > >      'imx378.json',
> > >      'imx477.json',
> > >      'imx477_noir.json',
> > > +    'imx477_scientific.json',
> > >      'imx519.json',
> > >      'ov5647.json',
> > >      'ov5647_noir.json',
Nicolas Dufresne via libcamera-devel Dec. 20, 2022, 12:09 p.m. UTC | #5
Hello - just a short comment below ( I hope I am doing this right - not 
really familiar with this email/list-based system)

Am 19.12.2022 um 23:53 schrieb Laurent Pinchart:
> Hello,
>
> On Fri, Dec 16, 2022 at 03:09:55PM +0000, Naushir Patuck wrote:
>> On Fri, 16 Dec 2022 at 14:25, Kieran Bingham wrote:
>>> Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
>>>> Add a tuning file for the IMX477 more suited to scientific applications.
>>>> The key differences from the original tuning file are:
>>>>
>>>> - Disable ALSC block completely
>>>> - Pure rec709 gamma curve, and no contrast enhance
>>>> - New CT curve and CCMs based on the illumination spectrum of a black body
>>>> radiator up to about 3600 K and the CIE illuminant D for higher color
>>>> temperatures.
>>>>
>>>> Further details on the changes can be found at:
>>>> https://forums.raspberrypi.com/viewtopic.php?t=343449
>>>>
>>>> All credit for these changes go to Dr. Rolf Henkel.
>>> Some very interesting investigations in that thread.
>>>
>>> I'm curious if we'll end up with more configurations like this for each
>>> sensor!
>> I think that's entirely possible - and all part of the design with json config
>> files!
>>
>>> But I really like the graphs to present what the tuning files
>>> are doing comparitively. Much easier to grasp than a file of json
>>> data...
>>>
>>> No objections to this here but apart from admiring the graphs, I won't
>>> judge the data so:
>>>
>>> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>>
>>>
>>> My only concern/comment would be how and where would we document the
>>> differences between these tuning files? Would users just be expected to
>>> try them to see ? Or would it be clear that a 'scientific' tuning file
>>> has a specific set of properties ?
>> At the end of the day, I think this is a choice for informed users. We provide
>> a sensible default config for visually pleasing images, but if users have a
>> specific application that requires something custom, we leave it to them to
>> switch to the appropriate tuning file that they know works for them.
> Overall that makes sense to me. In this particular case, I think it
> would however make sense to give applications a way to control the tone
> mapping curve at runtime (including disabling contrast enhancement)
> instead of having different curves specified in tuning files.

Indeed, it would be great to be able to control certain parameters at 
runtime. There are a number of automatic algorithms working in libcamera 
which presently can only be deactivated in akward ways - mostly by 
editing the tuning file. That is, you need to stop and restart the 
camera for such changes to take place. It would be great (for people who 
know what they are doing) to be able to deactivate automatic processing 
while the camera is running, for example.

> This isn't something that needs to be implemented urgently, and I'm fine
> with this patch, but if we have tuning files that differed only by their
> tone mapping curve, I'd get more annoyed.

Note that the tone mapping curve is not the most important deviation of 
this new tuning file from the standard tuning file. It does help to get 
slightly less trendy colors.

However, more important is probably the ct-curve, combined with new CCM 
matrices. These new values vary much smoother than the original values 
over the range of CCTs.

Another point: as soon as libcamera is starting to support sensors with 
interchangable lenses (and the Raspberry Pi HQ camera is one of these), 
the inclusion of the ALSC section in the tuning file makes it as well 
necessary to have a dedicated tuning file for every lens which you are 
planning to use. So maybe the addition of an info-section in the tuning 
file would be a thing to consider. Such an info-section could also 
include details on how the tuning file was created - something like that 
is currently missing. For example, the IMX477 tuning file for the HQ 
camera features ALSC-tables - but there is no information whatsoever 
which specific lens was used in the calibration.

LSC is in a sense rather independent from other sections in the 
processing pipeline. Maybe it even makes sense to split the monolithic 
json-file into independent parts?

>>> But any / all of that could be addressed later if needed I think.
>>>
>>>> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
>>>> Signed-off-by: Rolf Henkel <cpixip@pixelcircus.com>
>>>> ---
>>>>   .../raspberrypi/data/imx477_scientific.json   | 482 ++++++++++++++++++
>>>>   src/ipa/raspberrypi/data/meson.build          |   1 +
>>>>   2 files changed, 483 insertions(+)
>>>>   create mode 100755 src/ipa/raspberrypi/data/imx477_scientific.json
>>>>
>>>> diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json
>>>> new file mode 100755
>>>> index 000000000000..17c4ed0a5e74
>>>> --- /dev/null
>>>> +++ b/src/ipa/raspberrypi/data/imx477_scientific.json
>>>> @@ -0,0 +1,482 @@
>>>> +{
>>>> +    "version": 2.0,
>>>> +    "target": "bcm2835",
>>>> +    "algorithms": [
>>>> +        {
>>>> +            "rpi.black_level":
>>>> +            {
>>>> +                "black_level": 4096
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.dpc": { }
>>>> +        },
>>>> +        {
>>>> +            "rpi.lux":
>>>> +            {
>>>> +                "reference_shutter_speed": 27242,
>>>> +                "reference_gain": 1.0,
>>>> +                "reference_aperture": 1.0,
>>>> +                "reference_lux": 830,
>>>> +                "reference_Y": 17755
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.noise":
>>>> +            {
>>>> +                "reference_constant": 0,
>>>> +                "reference_slope": 2.767
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.geq":
>>>> +            {
>>>> +                "offset": 204,
>>>> +                "slope": 0.01078
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.sdn": { }
>>>> +        },
>>>> +        {
>>>> +            "rpi.awb":
>>>> +            {
>>>> +                "priors": [
>>>> +                    {
>>>> +                        "lux": 0,
>>>> +                        "prior":
>>>> +                        [
>>>> +                            2000, 1.0,
>>>> +                            3000, 0.0,
>>>> +                            13000, 0.0
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "lux": 800,
>>>> +                        "prior":
>>>> +                        [
>>>> +                            2000, 0.0,
>>>> +                            6000, 2.0,
>>>> +                            13000, 2.0
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "lux": 1500,
>>>> +                        "prior":
>>>> +                        [
>>>> +                            2000, 0.0,
>>>> +                            4000, 1.0,
>>>> +                            6000, 6.0,
>>>> +                            6500, 7.0,
>>>> +                            7000, 1.0,
>>>> +                            13000, 1.0
>>>> +                        ]
>>>> +                    }
>>>> +                ],
>>>> +                "modes":
>>>> +                {
>>>> +                    "auto":
>>>> +                    {
>>>> +                        "lo": 2500,
>>>> +                        "hi": 8000
>>>> +                    },
>>>> +                    "incandescent":
>>>> +                    {
>>>> +                        "lo": 2500,
>>>> +                        "hi": 3000
>>>> +                    },
>>>> +                    "tungsten":
>>>> +                    {
>>>> +                        "lo": 3000,
>>>> +                        "hi": 3500
>>>> +                    },
>>>> +                    "fluorescent":
>>>> +                    {
>>>> +                        "lo": 4000,
>>>> +                        "hi": 4700
>>>> +                    },
>>>> +                    "indoor":
>>>> +                    {
>>>> +                        "lo": 3000,
>>>> +                        "hi": 5000
>>>> +                    },
>>>> +                    "daylight":
>>>> +                    {
>>>> +                        "lo": 5500,
>>>> +                        "hi": 6500
>>>> +                    },
>>>> +                    "cloudy":
>>>> +                    {
>>>> +                        "lo": 7000,
>>>> +                        "hi": 8600
>>>> +                    }
>>>> +                },
>>>> +                "bayes": 1,
>>>> +                "ct_curve":
>>>> +                [
>>>> +                    2000.0, 0.6331025775790707, 0.27424225990946915,
>>>> +                    2200.0, 0.5696117366212947, 0.3116091368689487,
>>>> +                    2400.0, 0.5204264653110015, 0.34892179554105873,
>>>> +                    2600.0, 0.48148675531667223, 0.38565229719076793,
>>>> +                    2800.0, 0.450085403501908, 0.42145684622485047,
>>>> +                    3000.0, 0.42436130159169017, 0.45611835670028816,
>>>> +                    3200.0, 0.40300023695527337, 0.48950766215198593,
>>>> +                    3400.0, 0.3850520052612984, 0.5215567075837261,
>>>> +                    3600.0, 0.36981508088230314, 0.5522397906415475,
>>>> +                    4100.0, 0.333468007836758, 0.5909770465167908,
>>>> +                    4600.0, 0.31196097364221376, 0.6515706327327178,
>>>> +                    5100.0, 0.2961860409294588, 0.7068178946570284,
>>>> +                    5600.0, 0.2842607232745885, 0.7564837749584288,
>>>> +                    6100.0, 0.2750265787051251, 0.8006183524920533,
>>>> +                    6600.0, 0.2677057225584924, 0.8398879225373039,
>>>> +                    7100.0, 0.2617955199757274, 0.8746456080032436,
>>>> +                    7600.0, 0.25693714288250125, 0.905569559506562,
>>>> +                    8100.0, 0.25287531441063316, 0.9331696750390895,
>>>> +                    8600.0, 0.24946601483331993, 0.9576820904825795
>>>> +                ],
>>>> +                "sensitivity_r": 1.05,
>>>> +                "sensitivity_b": 1.05,
>>>> +                "transverse_pos": 0.0238,
>>>> +                "transverse_neg": 0.04429,
>>>> +                "coarse_step": 0.1
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.agc":
>>>> +            {
>>>> +                "metering_modes":
>>>> +                {
>>>> +                    "centre-weighted":
>>>> +                    {
>>>> +                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
>>>> +                    },
>>>> +                    "spot":
>>>> +                    {
>>>> +                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
>>>> +                    },
>>>> +                    "matrix":
>>>> +                    {
>>>> +                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
>>>> +                    }
>>>> +                },
>>>> +                "exposure_modes":
>>>> +                {
>>>> +                    "normal":
>>>> +                    {
>>>> +                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
>>>> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
>>>> +                    },
>>>> +                    "short":
>>>> +                    {
>>>> +                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
>>>> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
>>>> +                    },
>>>> +                    "long":
>>>> +                    {
>>>> +                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
>>>> +                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
>>>> +                    }
>>>> +                },
>>>> +                "constraint_modes":
>>>> +                {
>>>> +                    "normal": [
>>>> +                        {
>>>> +                            "bound": "LOWER",
>>>> +                            "q_lo": 0.98,
>>>> +                            "q_hi": 1.0,
>>>> +                            "y_target":
>>>> +                            [
>>>> +                                0, 0.3,
>>>> +                                1000, 0.3
>>>> +                            ]
>>>> +                        }
>>>> +                    ],
>>>> +                    "highlight": [
>>>> +                        {
>>>> +                            "bound": "LOWER",
>>>> +                            "q_lo": 0.98,
>>>> +                            "q_hi": 1.0,
>>>> +                            "y_target":
>>>> +                            [
>>>> +                                0, 0.3,
>>>> +                                1000, 0.3
>>>> +                            ]
>>>> +                        },
>>>> +                        {
>>>> +                            "bound": "UPPER",
>>>> +                            "q_lo": 0.98,
>>>> +                            "q_hi": 1.0,
>>>> +                            "y_target":
>>>> +                            [
>>>> +                                0, 0.8,
>>>> +                                1000, 0.8
>>>> +                            ]
>>>> +                        }
>>>> +                    ],
>>>> +                    "shadows": [
>>>> +                        {
>>>> +                            "bound": "LOWER",
>>>> +                            "q_lo": 0.0,
>>>> +                            "q_hi": 0.5,
>>>> +                            "y_target":
>>>> +                            [
>>>> +                                0, 0.17,
>>>> +                                1000, 0.17
>>>> +                            ]
>>>> +                        }
>>>> +                    ]
>>>> +                },
>>>> +                "y_target":
>>>> +                [
>>>> +                    0, 0.16,
>>>> +                    1000, 0.165,
>>>> +                    10000, 0.17
>>>> +                ]
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.contrast":
>>>> +            {
>>>> +                "ce_enable": 0,
>>>> +                "gamma_curve":
>>>> +                [
>>>> +                    0, 0,
>>>> +                    512, 2304,
>>>> +                    1024, 4608,
>>>> +                    1536, 6573,
>>>> +                    2048, 8401,
>>>> +                    2560, 9992,
>>>> +                    3072, 11418,
>>>> +                    3584, 12719,
>>>> +                    4096, 13922,
>>>> +                    4608, 15045,
>>>> +                    5120, 16103,
>>>> +                    5632, 17104,
>>>> +                    6144, 18056,
>>>> +                    6656, 18967,
>>>> +                    7168, 19839,
>>>> +                    7680, 20679,
>>>> +                    8192, 21488,
>>>> +                    9216, 23028,
>>>> +                    10240, 24477,
>>>> +                    11264, 25849,
>>>> +                    12288, 27154,
>>>> +                    13312, 28401,
>>>> +                    14336, 29597,
>>>> +                    15360, 30747,
>>>> +                    16384, 31856,
>>>> +                    17408, 32928,
>>>> +                    18432, 33966,
>>>> +                    19456, 34973,
>>>> +                    20480, 35952,
>>>> +                    22528, 37832,
>>>> +                    24576, 39621,
>>>> +                    26624, 41330,
>>>> +                    28672, 42969,
>>>> +                    30720, 44545,
>>>> +                    32768, 46065,
>>>> +                    34816, 47534,
>>>> +                    36864, 48956,
>>>> +                    38912, 50336,
>>>> +                    40960, 51677,
>>>> +                    43008, 52982,
>>>> +                    45056, 54253,
>>>> +                    47104, 55493,
>>>> +                    49152, 56704,
>>>> +                    51200, 57888,
>>>> +                    53248, 59046,
>>>> +                    55296, 60181,
>>>> +                    57344, 61292,
>>>> +                    59392, 62382,
>>>> +                    61440, 63452,
>>>> +                    63488, 64503,
>>>> +                    65535, 65535
>>>> +                ]
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.ccm":
>>>> +            {
>>>> +                "ccms": [
>>>> +                    {
>>>> +                        "ct": 2000,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.5813882365848004, -0.35293683714581114, -0.27378771561617715,
>>>> +                            -0.4347297185453639, 1.5792631087746074,  -0.12102601986382337,
>>>> +                            0.2322290578987574, -1.4382672640468128,   2.1386425781770755
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 2200,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.6322048484088305, -0.45932286857238486, -0.21373542690252198,
>>>> +                            -0.3970719209901105, 1.5877868651467202, -0.17249380832122455,
>>>> +                            0.20753774825903412, -1.2660673594740142, 2.005654261091916
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 2400,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.6766610071470398, -0.5447101051688111, -0.16838641107407676,
>>>> +                            -0.3659845183388154, 1.592223692670396, -0.2127091997471162,
>>>> +                            0.1833964516767549, -1.1339155942419321, 1.9089342978542396
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 2600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.7161984340622154, -0.6152585785678794, -0.1331100845092582,
>>>> +                            -0.33972082628066275, 1.5944888273736966, -0.2453979465898787,
>>>> +                            0.1615577497676328, -1.0298684958833109, 1.8357854177422053
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 2800,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.7519307259815728, -0.6748682080165339, -0.10515169074540848,
>>>> +                            -0.3171703484479931, 1.5955820297498486, -0.2727395854813966,
>>>> +                            0.14230870739974305, -0.9460976023551511, 1.778709391659538
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 3000,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.7846716625128374, -0.7261240476375332, -0.08274697420358428,
>>>> +                            -0.2975654035173307, 1.5960425637021738, -0.2961043416505157,
>>>> +                            0.12546426281675097, -0.8773434727076518, 1.7330356805246685
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 3200,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.8150085872943436, -0.7708109672515514, -0.06469468211419174,
>>>> +                            -0.2803468940646277, 1.596168842967451, -0.3164044170681625,
>>>> +                            0.11071494533513807, -0.8199772290209191, 1.69572135046367
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 3400,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.8433668304932087, -0.8102060605062592, -0.05013485852801454,
>>>> +                            -0.2650934036324084, 1.5961288492969294, -0.33427554893845535,
>>>> +                            0.0977478941863518, -0.7714303112098978, 1.6647070820146963
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 3600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.8700575831917468, -0.8452518300291346, -0.03842644337477299,
>>>> +                            -0.2514794528347016, 1.5960178299141876, -0.3501774949366156,
>>>> +                            0.08628520830733245, -0.729841503339915, 1.638553343939267
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 4100,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.8988700903560716, -0.8911278803351247, -0.018848644425650693,
>>>> +                            -0.21487101487384094, 1.599236541382614, -0.39405450457918206,
>>>> +                            0.08251488056482173, -0.7178919368326191, 1.6267009056502704
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 4600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            1.960355191764125, -0.9624344812121991, -0.0017122408632169205,
>>>> +                            -0.19444620905212898, 1.5978493736948447, -0.416727638296156,
>>>> +                            0.06310261513271084, -0.6483790952487849, 1.5834605477213093
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 5100,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.014680536961399, -1.0195930302148566, 0.007728256612638915,
>>>> +                            -0.17751999660735496, 1.5977081555831, -0.4366085498741474,
>>>> +                            0.04741267583041334, -0.5950327902073489, 1.5512919847321853
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 5600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.062652337917251, -1.0658386679125478, 0.011886354256281267,
>>>> +                            -0.16319197721451495, 1.598363237584736, -0.45422061523742235,
>>>> +                            0.03465810928795378, -0.5535454108047286, 1.5269025836946852
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 6100,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.104985902038069, -1.103597868736314, 0.012503517136539277,
>>>> +                            -0.15090797064906178, 1.5994703078166095, -0.4698414300864995,
>>>> +                            0.02421766063474242, -0.5208922818196823, 1.5081270847783788
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 6600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.1424988751299714, -1.134760232367728, 0.010730356010435522,
>>>> +                            -0.14021846798466234, 1.600822462230719, -0.48379204794526487,
>>>> +                            0.015521315410496622, -0.49463630325832275, 1.4933313534840327
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 7100,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.1758034100130925, -1.1607558481037359, 0.007452724895469076,
>>>> +                            -0.13085694672641826, 1.6022648614493245, -0.4962330524084075,
>>>> +                            0.008226943206113427, -0.4733077192319791, 1.4815336120437468
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 7600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.205529206931895, -1.1826662383072108, 0.0032019529917605167,
>>>> +                            -0.122572009780486, 1.6037258133595753, -0.5073973734282445,
>>>> +                            0.0020132587619863425, -0.4556590236414181, 1.471939788496745
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 8100,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.232224969223067, -1.2013672897252885, -0.0016234598095482985,
>>>> +                            -0.11518026734442414, 1.6051544769439803, -0.5174558699422255,
>>>> +                            -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452
>>>> +                        ]
>>>> +                    },
>>>> +                    {
>>>> +                        "ct": 8600,
>>>> +                        "ccm":
>>>> +                        [
>>>> +                            2.256082295891265, -1.2173210549996634, -0.0067231350481711675,
>>>> +                            -0.10860272839843167, 1.6065150139140594, -0.5264728573611493,
>>>> +                            -0.007952618707984149, -0.4284003574050791, 1.4574646927117558
>>>> +                        ]
>>>> +                    }
>>>> +                ]
>>>> +            }
>>>> +        },
>>>> +        {
>>>> +            "rpi.sharpen": { }
>>>> +        },
>>>> +        {
>>>> +            "rpi.focus": { }
>>>> +        }
>>>> +    ]
>>>> +}
>>>> \ No newline at end of file
>>>> diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
>>>> index 84c1dabbec9c..5565508cf602 100644
>>>> --- a/src/ipa/raspberrypi/data/meson.build
>>>> +++ b/src/ipa/raspberrypi/data/meson.build
>>>> @@ -9,6 +9,7 @@ conf_files = files([
>>>>       'imx378.json',
>>>>       'imx477.json',
>>>>       'imx477_noir.json',
>>>> +    'imx477_scientific.json',
>>>>       'imx519.json',
>>>>       'ov5647.json',
>>>>       'ov5647_noir.json',
Kieran Bingham Dec. 21, 2022, 1 p.m. UTC | #6
Quoting cpixip--- via libcamera-devel (2022-12-20 12:09:23)
> Hello - just a short comment below ( I hope I am doing this right - not 
> really familiar with this email/list-based system)
> 

Hi - yes you're doing fine ;-)


> Am 19.12.2022 um 23:53 schrieb Laurent Pinchart:
> > Hello,
> >
> > On Fri, Dec 16, 2022 at 03:09:55PM +0000, Naushir Patuck wrote:
> >> On Fri, 16 Dec 2022 at 14:25, Kieran Bingham wrote:
> >>> Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
> >>>> Add a tuning file for the IMX477 more suited to scientific applications.
> >>>> The key differences from the original tuning file are:
> >>>>
> >>>> - Disable ALSC block completely
> >>>> - Pure rec709 gamma curve, and no contrast enhance
> >>>> - New CT curve and CCMs based on the illumination spectrum of a black body
> >>>> radiator up to about 3600 K and the CIE illuminant D for higher color
> >>>> temperatures.
> >>>>
> >>>> Further details on the changes can be found at:
> >>>> https://forums.raspberrypi.com/viewtopic.php?t=343449
> >>>>
> >>>> All credit for these changes go to Dr. Rolf Henkel.
> >>> Some very interesting investigations in that thread.
> >>>
> >>> I'm curious if we'll end up with more configurations like this for each
> >>> sensor!
> >> I think that's entirely possible - and all part of the design with json config
> >> files!
> >>
> >>> But I really like the graphs to present what the tuning files
> >>> are doing comparitively. Much easier to grasp than a file of json
> >>> data...
> >>>
> >>> No objections to this here but apart from admiring the graphs, I won't
> >>> judge the data so:
> >>>
> >>> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> >>>
> >>>
> >>> My only concern/comment would be how and where would we document the
> >>> differences between these tuning files? Would users just be expected to
> >>> try them to see ? Or would it be clear that a 'scientific' tuning file
> >>> has a specific set of properties ?
> >> At the end of the day, I think this is a choice for informed users. We provide
> >> a sensible default config for visually pleasing images, but if users have a
> >> specific application that requires something custom, we leave it to them to
> >> switch to the appropriate tuning file that they know works for them.
> > Overall that makes sense to me. In this particular case, I think it
> > would however make sense to give applications a way to control the tone
> > mapping curve at runtime (including disabling contrast enhancement)
> > instead of having different curves specified in tuning files.
> 
> Indeed, it would be great to be able to control certain parameters at 
> runtime. There are a number of automatic algorithms working in libcamera 
> which presently can only be deactivated in akward ways - mostly by 
> editing the tuning file. That is, you need to stop and restart the 
> camera for such changes to take place. It would be great (for people who 
> know what they are doing) to be able to deactivate automatic processing 
> while the camera is running, for example.

I would expect this is entirely possible by providing the controls to
enable/disable automatic features, just like we do with manual
gain/manual exposure.

 
> > This isn't something that needs to be implemented urgently, and I'm fine
> > with this patch, but if we have tuning files that differed only by their
> > tone mapping curve, I'd get more annoyed.
> 
> Note that the tone mapping curve is not the most important deviation of 
> this new tuning file from the standard tuning file. It does help to get 
> slightly less trendy colors.
> 
> However, more important is probably the ct-curve, combined with new CCM 
> matrices. These new values vary much smoother than the original values 
> over the range of CCTs.
> 
> Another point: as soon as libcamera is starting to support sensors with 
> interchangable lenses (and the Raspberry Pi HQ camera is one of these), 
> the inclusion of the ALSC section in the tuning file makes it as well 
> necessary to have a dedicated tuning file for every lens which you are 
> planning to use. So maybe the addition of an info-section in the tuning 
> file would be a thing to consider. Such an info-section could also 
> include details on how the tuning file was created - something like that 
> is currently missing. For example, the IMX477 tuning file for the HQ 
> camera features ALSC-tables - but there is no information whatsoever 
> which specific lens was used in the calibration.
> 
> LSC is in a sense rather independent from other sections in the 
> processing pipeline. Maybe it even makes sense to split the monolithic 
> json-file into independent parts?

Splitting could make sense so there's a default. But either way, we need
to figure out how to make more 'module' specific tuning files.

Ultimately, I would expect a different lens to have impacts across
the whole tuning data?

--
Kieran
Laurent Pinchart Dec. 21, 2022, 2:22 p.m. UTC | #7
On Wed, Dec 21, 2022 at 01:00:17PM +0000, Kieran Bingham via libcamera-devel wrote:
> Quoting cpixip--- via libcamera-devel (2022-12-20 12:09:23)
> > Hello - just a short comment below ( I hope I am doing this right - not 
> > really familiar with this email/list-based system)
> 
> Hi - yes you're doing fine ;-)
> 
> > Am 19.12.2022 um 23:53 schrieb Laurent Pinchart:
> > > On Fri, Dec 16, 2022 at 03:09:55PM +0000, Naushir Patuck wrote:
> > >> On Fri, 16 Dec 2022 at 14:25, Kieran Bingham wrote:
> > >>> Quoting Naushir Patuck via libcamera-devel (2022-12-16 13:59:03)
> > >>>> Add a tuning file for the IMX477 more suited to scientific applications.
> > >>>> The key differences from the original tuning file are:
> > >>>>
> > >>>> - Disable ALSC block completely
> > >>>> - Pure rec709 gamma curve, and no contrast enhance
> > >>>> - New CT curve and CCMs based on the illumination spectrum of a black body
> > >>>> radiator up to about 3600 K and the CIE illuminant D for higher color
> > >>>> temperatures.
> > >>>>
> > >>>> Further details on the changes can be found at:
> > >>>> https://forums.raspberrypi.com/viewtopic.php?t=343449
> > >>>>
> > >>>> All credit for these changes go to Dr. Rolf Henkel.
> > >>> Some very interesting investigations in that thread.
> > >>>
> > >>> I'm curious if we'll end up with more configurations like this for each
> > >>> sensor!
> > >>>
> > >> I think that's entirely possible - and all part of the design with json config
> > >> files!
> > >>
> > >>> But I really like the graphs to present what the tuning files
> > >>> are doing comparitively. Much easier to grasp than a file of json
> > >>> data...
> > >>>
> > >>> No objections to this here but apart from admiring the graphs, I won't
> > >>> judge the data so:
> > >>>
> > >>> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> > >>>
> > >>>
> > >>> My only concern/comment would be how and where would we document the
> > >>> differences between these tuning files? Would users just be expected to
> > >>> try them to see ? Or would it be clear that a 'scientific' tuning file
> > >>> has a specific set of properties ?
> > >>
> > >> At the end of the day, I think this is a choice for informed users. We provide
> > >> a sensible default config for visually pleasing images, but if users have a
> > >> specific application that requires something custom, we leave it to them to
> > >> switch to the appropriate tuning file that they know works for them.
> > >
> > > Overall that makes sense to me. In this particular case, I think it
> > > would however make sense to give applications a way to control the tone
> > > mapping curve at runtime (including disabling contrast enhancement)
> > > instead of having different curves specified in tuning files.
> > 
> > Indeed, it would be great to be able to control certain parameters at 
> > runtime. There are a number of automatic algorithms working in libcamera 
> > which presently can only be deactivated in akward ways - mostly by 
> > editing the tuning file. That is, you need to stop and restart the 
> > camera for such changes to take place. It would be great (for people who 
> > know what they are doing) to be able to deactivate automatic processing 
> > while the camera is running, for example.
> 
> I would expect this is entirely possible by providing the controls to
> enable/disable automatic features, just like we do with manual
> gain/manual exposure.

It should be, but not all automatic features implemented in the
Raspberry Pi IPA have corresponding controls. Contrast enhancement is
one such feature that lacks a control.

Some features may be difficult to enable or disable at runtime, making
them a target for being controlled through the start() call only, but
even that would be an improvement compared to having to create custom
tuning files.

> > > This isn't something that needs to be implemented urgently, and I'm fine
> > > with this patch, but if we have tuning files that differed only by their
> > > tone mapping curve, I'd get more annoyed.
> > 
> > Note that the tone mapping curve is not the most important deviation of 
> > this new tuning file from the standard tuning file. It does help to get 
> > slightly less trendy colors.
> > 
> > However, more important is probably the ct-curve, combined with new CCM 
> > matrices. These new values vary much smoother than the original values 
> > over the range of CCTs.

Those would be more awkward to control through standard controls I
believe, as they are quite specific to the Raspberry Pi implementation
of the corresponding algorithms.

> > Another point: as soon as libcamera is starting to support sensors with 
> > interchangable lenses (and the Raspberry Pi HQ camera is one of these), 
> > the inclusion of the ALSC section in the tuning file makes it as well 
> > necessary to have a dedicated tuning file for every lens which you are 
> > planning to use. So maybe the addition of an info-section in the tuning 
> > file would be a thing to consider. Such an info-section could also 
> > include details on how the tuning file was created - something like that 
> > is currently missing. For example, the IMX477 tuning file for the HQ 
> > camera features ALSC-tables - but there is no information whatsoever 
> > which specific lens was used in the calibration.

That's a very good idea ! I've recorded it in
https://bugs.libcamera.org/show_bug.cgi?id=175.

> > LSC is in a sense rather independent from other sections in the 
> > processing pipeline. Maybe it even makes sense to split the monolithic 
> > json-file into independent parts?
> 
> Splitting could make sense so there's a default. But either way, we need
> to figure out how to make more 'module' specific tuning files.
> 
> Ultimately, I would expect a different lens to have impacts across
> the whole tuning data?

Patch
diff mbox series

diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json
new file mode 100755
index 000000000000..17c4ed0a5e74
--- /dev/null
+++ b/src/ipa/raspberrypi/data/imx477_scientific.json
@@ -0,0 +1,482 @@ 
+{
+    "version": 2.0,
+    "target": "bcm2835",
+    "algorithms": [
+        {
+            "rpi.black_level":
+            {
+                "black_level": 4096
+            }
+        },
+        {
+            "rpi.dpc": { }
+        },
+        {
+            "rpi.lux":
+            {
+                "reference_shutter_speed": 27242,
+                "reference_gain": 1.0,
+                "reference_aperture": 1.0,
+                "reference_lux": 830,
+                "reference_Y": 17755
+            }
+        },
+        {
+            "rpi.noise":
+            {
+                "reference_constant": 0,
+                "reference_slope": 2.767
+            }
+        },
+        {
+            "rpi.geq":
+            {
+                "offset": 204,
+                "slope": 0.01078
+            }
+        },
+        {
+            "rpi.sdn": { }
+        },
+        {
+            "rpi.awb":
+            {
+                "priors": [
+                    {
+                        "lux": 0,
+                        "prior":
+                        [
+                            2000, 1.0,
+                            3000, 0.0,
+                            13000, 0.0
+                        ]
+                    },
+                    {
+                        "lux": 800,
+                        "prior":
+                        [
+                            2000, 0.0,
+                            6000, 2.0,
+                            13000, 2.0
+                        ]
+                    },
+                    {
+                        "lux": 1500,
+                        "prior":
+                        [
+                            2000, 0.0,
+                            4000, 1.0,
+                            6000, 6.0,
+                            6500, 7.0,
+                            7000, 1.0,
+                            13000, 1.0
+                        ]
+                    }
+                ],
+                "modes":
+                {
+                    "auto":
+                    {
+                        "lo": 2500,
+                        "hi": 8000
+                    },
+                    "incandescent":
+                    {
+                        "lo": 2500,
+                        "hi": 3000
+                    },
+                    "tungsten":
+                    {
+                        "lo": 3000,
+                        "hi": 3500
+                    },
+                    "fluorescent":
+                    {
+                        "lo": 4000,
+                        "hi": 4700
+                    },
+                    "indoor":
+                    {
+                        "lo": 3000,
+                        "hi": 5000
+                    },
+                    "daylight":
+                    {
+                        "lo": 5500,
+                        "hi": 6500
+                    },
+                    "cloudy":
+                    {
+                        "lo": 7000,
+                        "hi": 8600
+                    }
+                },
+                "bayes": 1,
+                "ct_curve":
+                [
+                    2000.0, 0.6331025775790707, 0.27424225990946915,
+                    2200.0, 0.5696117366212947, 0.3116091368689487,
+                    2400.0, 0.5204264653110015, 0.34892179554105873,
+                    2600.0, 0.48148675531667223, 0.38565229719076793,
+                    2800.0, 0.450085403501908, 0.42145684622485047,
+                    3000.0, 0.42436130159169017, 0.45611835670028816,
+                    3200.0, 0.40300023695527337, 0.48950766215198593,
+                    3400.0, 0.3850520052612984, 0.5215567075837261,
+                    3600.0, 0.36981508088230314, 0.5522397906415475,
+                    4100.0, 0.333468007836758, 0.5909770465167908,
+                    4600.0, 0.31196097364221376, 0.6515706327327178,
+                    5100.0, 0.2961860409294588, 0.7068178946570284,
+                    5600.0, 0.2842607232745885, 0.7564837749584288,
+                    6100.0, 0.2750265787051251, 0.8006183524920533,
+                    6600.0, 0.2677057225584924, 0.8398879225373039,
+                    7100.0, 0.2617955199757274, 0.8746456080032436,
+                    7600.0, 0.25693714288250125, 0.905569559506562,
+                    8100.0, 0.25287531441063316, 0.9331696750390895,
+                    8600.0, 0.24946601483331993, 0.9576820904825795
+                ],
+                "sensitivity_r": 1.05,
+                "sensitivity_b": 1.05,
+                "transverse_pos": 0.0238,
+                "transverse_neg": 0.04429,
+                "coarse_step": 0.1
+            }
+        },
+        {
+            "rpi.agc":
+            {
+                "metering_modes":
+                {
+                    "centre-weighted":
+                    {
+                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                    },
+                    "spot":
+                    {
+                        "weights": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
+                    },
+                    "matrix":
+                    {
+                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
+                    }
+                },
+                "exposure_modes":
+                {
+                    "normal":
+                    {
+                        "shutter": [ 100, 10000, 30000, 60000, 66666 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                    },
+                    "short":
+                    {
+                        "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                    },
+                    "long":
+                    {
+                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]
+                    }
+                },
+                "constraint_modes":
+                {
+                    "normal": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.3,
+                                1000, 0.3
+                            ]
+                        }
+                    ],
+                    "highlight": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.3,
+                                1000, 0.3
+                            ]
+                        },
+                        {
+                            "bound": "UPPER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.8,
+                                1000, 0.8
+                            ]
+                        }
+                    ],
+                    "shadows": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.0,
+                            "q_hi": 0.5,
+                            "y_target":
+                            [
+                                0, 0.17,
+                                1000, 0.17
+                            ]
+                        }
+                    ]
+                },
+                "y_target":
+                [
+                    0, 0.16,
+                    1000, 0.165,
+                    10000, 0.17
+                ]
+            }
+        },
+        {
+            "rpi.contrast":
+            {
+                "ce_enable": 0,
+                "gamma_curve":
+                [
+                    0, 0,
+                    512, 2304,
+                    1024, 4608,
+                    1536, 6573,
+                    2048, 8401,
+                    2560, 9992,
+                    3072, 11418,
+                    3584, 12719,
+                    4096, 13922,
+                    4608, 15045,
+                    5120, 16103,
+                    5632, 17104,
+                    6144, 18056,
+                    6656, 18967,
+                    7168, 19839,
+                    7680, 20679,
+                    8192, 21488,
+                    9216, 23028,
+                    10240, 24477,
+                    11264, 25849,
+                    12288, 27154,
+                    13312, 28401,
+                    14336, 29597,
+                    15360, 30747,
+                    16384, 31856,
+                    17408, 32928,
+                    18432, 33966,
+                    19456, 34973,
+                    20480, 35952,
+                    22528, 37832,
+                    24576, 39621,
+                    26624, 41330,
+                    28672, 42969,
+                    30720, 44545,
+                    32768, 46065,
+                    34816, 47534,
+                    36864, 48956,
+                    38912, 50336,
+                    40960, 51677,
+                    43008, 52982,
+                    45056, 54253,
+                    47104, 55493,
+                    49152, 56704,
+                    51200, 57888,
+                    53248, 59046,
+                    55296, 60181,
+                    57344, 61292,
+                    59392, 62382,
+                    61440, 63452,
+                    63488, 64503,
+                    65535, 65535
+                ]
+            }
+        },
+        {
+            "rpi.ccm":
+            {
+                "ccms": [
+                    {
+                        "ct": 2000,
+                        "ccm":
+                        [
+                            1.5813882365848004, -0.35293683714581114, -0.27378771561617715,
+                            -0.4347297185453639, 1.5792631087746074, -0.12102601986382337,
+                            0.2322290578987574, -1.4382672640468128, 2.1386425781770755
+                        ]
+                    },
+                    {
+                        "ct": 2200,
+                        "ccm":
+                        [
+                            1.6322048484088305, -0.45932286857238486, -0.21373542690252198,
+                            -0.3970719209901105, 1.5877868651467202, -0.17249380832122455,
+                            0.20753774825903412, -1.2660673594740142, 2.005654261091916
+                        ]
+                    },
+                    {
+                        "ct": 2400,
+                        "ccm":
+                        [
+                            1.6766610071470398, -0.5447101051688111, -0.16838641107407676,
+                            -0.3659845183388154, 1.592223692670396, -0.2127091997471162,
+                            0.1833964516767549, -1.1339155942419321, 1.9089342978542396
+                        ]
+                    },
+                    {
+                        "ct": 2600,
+                        "ccm":
+                        [
+                            1.7161984340622154, -0.6152585785678794, -0.1331100845092582,
+                            -0.33972082628066275, 1.5944888273736966, -0.2453979465898787,
+                            0.1615577497676328, -1.0298684958833109, 1.8357854177422053
+                        ]
+                    },
+                    {
+                        "ct": 2800,
+                        "ccm":
+                        [
+                            1.7519307259815728, -0.6748682080165339, -0.10515169074540848,
+                            -0.3171703484479931, 1.5955820297498486, -0.2727395854813966,
+                            0.14230870739974305, -0.9460976023551511, 1.778709391659538
+                        ]
+                    },
+                    {
+                        "ct": 3000,
+                        "ccm":
+                        [
+                            1.7846716625128374, -0.7261240476375332, -0.08274697420358428,
+                            -0.2975654035173307, 1.5960425637021738, -0.2961043416505157,
+                            0.12546426281675097, -0.8773434727076518, 1.7330356805246685
+                        ]
+                    },
+                    {
+                        "ct": 3200,
+                        "ccm":
+                        [
+                            1.8150085872943436, -0.7708109672515514, -0.06469468211419174,
+                            -0.2803468940646277, 1.596168842967451, -0.3164044170681625,
+                            0.11071494533513807, -0.8199772290209191, 1.69572135046367
+                        ]
+                    },
+                    {
+                        "ct": 3400,
+                        "ccm":
+                        [
+                            1.8433668304932087, -0.8102060605062592, -0.05013485852801454,
+                            -0.2650934036324084, 1.5961288492969294, -0.33427554893845535,
+                            0.0977478941863518, -0.7714303112098978, 1.6647070820146963
+                        ]
+                    },
+                    {
+                        "ct": 3600,
+                        "ccm":
+                        [
+                            1.8700575831917468, -0.8452518300291346, -0.03842644337477299,
+                            -0.2514794528347016, 1.5960178299141876, -0.3501774949366156,
+                            0.08628520830733245, -0.729841503339915, 1.638553343939267
+                        ]
+                    },
+                    {
+                        "ct": 4100,
+                        "ccm":
+                        [
+                            1.8988700903560716, -0.8911278803351247, -0.018848644425650693,
+                            -0.21487101487384094, 1.599236541382614, -0.39405450457918206,
+                            0.08251488056482173, -0.7178919368326191, 1.6267009056502704
+                        ]
+                    },
+                    {
+                        "ct": 4600,
+                        "ccm":
+                        [
+                            1.960355191764125, -0.9624344812121991, -0.0017122408632169205,
+                            -0.19444620905212898, 1.5978493736948447, -0.416727638296156,
+                            0.06310261513271084, -0.6483790952487849, 1.5834605477213093
+                        ]
+                    },
+                    {
+                        "ct": 5100,
+                        "ccm":
+                        [
+                            2.014680536961399, -1.0195930302148566, 0.007728256612638915,
+                            -0.17751999660735496, 1.5977081555831, -0.4366085498741474,
+                            0.04741267583041334, -0.5950327902073489, 1.5512919847321853
+                        ]
+                    },
+                    {
+                        "ct": 5600,
+                        "ccm":
+                        [
+                            2.062652337917251, -1.0658386679125478, 0.011886354256281267,
+                            -0.16319197721451495, 1.598363237584736, -0.45422061523742235,
+                            0.03465810928795378, -0.5535454108047286, 1.5269025836946852
+                        ]
+                    },
+                    {
+                        "ct": 6100,
+                        "ccm":
+                        [
+                            2.104985902038069, -1.103597868736314, 0.012503517136539277,
+                            -0.15090797064906178, 1.5994703078166095, -0.4698414300864995,
+                            0.02421766063474242, -0.5208922818196823, 1.5081270847783788
+                        ]
+                    },
+                    {
+                        "ct": 6600,
+                        "ccm":
+                        [
+                            2.1424988751299714, -1.134760232367728, 0.010730356010435522,
+                            -0.14021846798466234, 1.600822462230719, -0.48379204794526487,
+                            0.015521315410496622, -0.49463630325832275, 1.4933313534840327
+                        ]
+                    },
+                    {
+                        "ct": 7100,
+                        "ccm":
+                        [
+                            2.1758034100130925, -1.1607558481037359, 0.007452724895469076,
+                            -0.13085694672641826, 1.6022648614493245, -0.4962330524084075,
+                            0.008226943206113427, -0.4733077192319791, 1.4815336120437468
+                        ]
+                    },
+                    {
+                        "ct": 7600,
+                        "ccm":
+                        [
+                            2.205529206931895, -1.1826662383072108, 0.0032019529917605167,
+                            -0.122572009780486, 1.6037258133595753, -0.5073973734282445,
+                            0.0020132587619863425, -0.4556590236414181, 1.471939788496745
+                        ]
+                    },
+                    {
+                        "ct": 8100,
+                        "ccm":
+                        [
+                            2.232224969223067, -1.2013672897252885, -0.0016234598095482985,
+                            -0.11518026734442414, 1.6051544769439803, -0.5174558699422255,
+                            -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452
+                        ]
+                    },
+                    {
+                        "ct": 8600,
+                        "ccm":
+                        [
+                            2.256082295891265, -1.2173210549996634, -0.0067231350481711675,
+                            -0.10860272839843167, 1.6065150139140594, -0.5264728573611493,
+                            -0.007952618707984149, -0.4284003574050791, 1.4574646927117558
+                        ]
+                    }
+                ]
+            }
+        },
+        {
+            "rpi.sharpen": { }
+        },
+        {
+            "rpi.focus": { }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
index 84c1dabbec9c..5565508cf602 100644
--- a/src/ipa/raspberrypi/data/meson.build
+++ b/src/ipa/raspberrypi/data/meson.build
@@ -9,6 +9,7 @@  conf_files = files([
     'imx378.json',
     'imx477.json',
     'imx477_noir.json',
+    'imx477_scientific.json',
     'imx519.json',
     'ov5647.json',
     'ov5647_noir.json',