[libcamera-devel] [PATCH v4 29/32] ipa: rkisp1: awb: Prevent RGB means from being negative

Jacopo Mondi jacopo at jmondi.org
Thu Sep 22 12:42:48 CEST 2022


Hi Laurent

On Thu, Sep 08, 2022 at 04:41:57AM +0300, Laurent Pinchart via libcamera-devel wrote:
> Due to hardware rounding errors in the YCbCr means, the calculated RGB

Is it due to rounding or simply because
the values of yMean, cbMean and crMean

		double yMean = awb->awb_mean[0].mean_y_or_g;
		double cbMean = awb->awb_mean[0].mean_cb_or_b;
		double crMean = awb->awb_mean[0].mean_cr_or_r;

		/*
		 * Convert from YCbCr to RGB.
		 * The hardware uses the following formulas:
		 * Y = 16 + 0.2500 R + 0.5000 G + 0.1094 B
		 * Cb = 128 - 0.1406 R - 0.2969 G + 0.4375 B
		 * Cr = 128 + 0.4375 R - 0.3750 G - 0.0625 B
		 *
		 * The inverse matrix is thus:
		 * [[1,1636, -0,0623,  1,6008]
		 *  [1,1636, -0,4045, -0,7949]
		 *  [1,1636,  1,9912, -0,0250]]
		 */
		yMean -= 16;
		cbMean -= 128;
		crMean -= 128;

are smaller than the above offsets ? I guess this can happen when the
image is particularly dark, right ?

Anyway, this certainly fixes an issue

Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks
  j

> means may be negative. This would lead to negative gains, messing up
> calculation. Prevent this by clamping the means to positive values.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/ipa/rkisp1/algorithms/awb.cpp | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index ed91e9277a16..de54c4d24650 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -242,6 +242,16 @@ void Awb::process(IPAContext &context,
>  		redMean = 1.1636 * yMean - 0.0623 * cbMean + 1.6008 * crMean;
>  		greenMean = 1.1636 * yMean - 0.4045 * cbMean - 0.7949 * crMean;
>  		blueMean = 1.1636 * yMean + 1.9912 * cbMean - 0.0250 * crMean;
> +
> +		/*
> +		 * Due to hardware rounding errors in the YCbCr means, the
> +		 * calculated RGB means may be negative. This would lead to
> +		 * negative gains, messing up calculation. Prevent this by
> +		 * clamping the means to positive values.
> +		 */
> +		redMean = std::max(redMean, 0.0);
> +		greenMean = std::max(greenMean, 0.0);
> +		blueMean = std::max(blueMean, 0.0);
>  	}
>
>  	/*
> --
> Regards,
>
> Laurent Pinchart
>


More information about the libcamera-devel mailing list