[libcamera-devel] [PATCH v2 03/13] ipa: ipu3: awb: Use saturation under 90%

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Oct 21 04:10:50 CEST 2021


Hi Jean-Michel,

Thank you for the patch.

On Wed, Oct 20, 2021 at 05:45:57PM +0200, Jean-Michel Hautbois wrote:
> The AWB grey world algorithm tries to find a grey value and it can't do
> it on over-exposed images. To exclude those, the saturation ratio is
> used for each cell, and the cell is included only if this ratio is 0.
> 
> Now that we have changed the threshold, more cells may be considered as
> partially saturated and excluded, preventing the algorithm from running
> efficiently.
> 
> Change that behaviour, and consider 90% as a good enough ratio.
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/awb.cpp | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
> index e44bbd6c..62c72cce 100644
> --- a/src/ipa/ipu3/algorithms/awb.cpp
> +++ b/src/ipa/ipu3/algorithms/awb.cpp
> @@ -19,6 +19,12 @@ LOG_DEFINE_CATEGORY(IPU3Awb)
>  
>  static constexpr uint32_t kMinGreenLevelInZone = 32;
>  
> +/* Minimum proportion of cells counted within a zone for it to be relevant */
> +static constexpr double kMinRelevantCellsRatio = 0.8;
> +
> +/* Number of cells below the saturation ratio */
> +static constexpr uint32_t kSaturationThreshold = 255 * 90 / 100;

Isn't this the ratio of saturated pixels in the cell, not the number of
cells ?

/*
 * Maximum ratio of saturated pixels in a cell for the cell to be considered
 * non-saturated and counted by the AWB algorithm.
 */
static constexpr uint32_t kMaxCellSaturationRatio = 255 * 90 / 100;

Maybe the first constant could then become

/*
 * Minimum proportion of non-saturated cells in a zone for the zone to be used
 * by the AWB algorithm.
 */
static constexpr double kMinCellsPerZoneRatio = 0.8;

(this matches the "cells per zone" from the cellsPerZoneThreshold_
variable below)

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +
>  /**
>   * \struct Accumulator
>   * \brief RGB statistics for a given zone
> @@ -160,7 +166,8 @@ int Awb::configure(IPAContext &context,
>  	 * for it to be relevant for the grey world algorithm.
>  	 * \todo This proportion could be configured.
>  	 */
> -	cellsPerZoneThreshold_ = cellsPerZoneX_ * cellsPerZoneY_ * 80 / 100;
> +	cellsPerZoneThreshold_ = cellsPerZoneX_ * cellsPerZoneY_ * kMinRelevantCellsRatio;
> +	LOG(IPU3Awb, Debug) << "Threshold for AWB is set to " << cellsPerZoneThreshold_;
>  
>  	return 0;
>  }
> @@ -234,7 +241,18 @@ void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats)
>  				reinterpret_cast<const ipu3_uapi_awb_set_item *>(
>  					&stats->awb_raw_buffer.meta_data[cellPosition]
>  				);
> -			if (currentCell->sat_ratio == 0) {
> +
> +			/*
> +			 * Use cells which have less than 90%
> +			 * saturation as an initial means to include
> +			 * otherwise bright cells which are not fully
> +			 * saturated.
> +			 *
> +			 * \todo The 90% saturation rate may require
> +			 * further empirical measurements and
> +			 * optimisation during camera tuning phases.
> +			 */
> +			if (currentCell->sat_ratio <= kSaturationThreshold) {
>  				/* The cell is not saturated, use the current cell */
>  				awbStats_[awbZonePosition].counted++;
>  				uint32_t greenValue = currentCell->Gr_avg + currentCell->Gb_avg;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list