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

Jean-Michel Hautbois jeanmichel.hautbois at ideasonboard.com
Fri Oct 22 07:29:00 CEST 2021


Hi Laurent,

On 22/10/2021 05:59, Laurent Pinchart wrote:
> Hi Jean-Michel,
> 
> Thank you for the patch.
> 
> On Thu, Oct 21, 2021 at 06:43:50PM +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>
>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>> ---
>>   src/ipa/ipu3/algorithms/awb.cpp | 28 ++++++++++++++++++++++++++--
>>   1 file changed, 26 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
>> index 4364928c..ce01791b 100644
>> --- a/src/ipa/ipu3/algorithms/awb.cpp
>> +++ b/src/ipa/ipu3/algorithms/awb.cpp
>> @@ -19,6 +19,18 @@ LOG_DEFINE_CATEGORY(IPU3Awb)
>>   
>>   static constexpr uint32_t kMinGreenLevelInZone = 32;
>>   
>> +/*
>> + * Minimum proportion of non-saturated cells in a zone for the zone to be used
>> + * by the AWB algorithm.
>> + */
>> +static constexpr double kMinRelevantCellsRatio = 0.8;
>> +
>> +/*
>> + * 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 kSaturationThreshold = 255 * 90 / 100;
> 
> In addition to the comments, I've also commented on constant names in
> the review of v2. You're of course free to disagree with review
> comments, but with no answer to the review, I can't know if you have
> kept the previous names on purpose or just haven't noticed the proposal.
> 

Oh, yes, you are right, I got the comments, but did not read your 
comment properly. Fixed in v4, thanks and sorry :-/.

>> +
>>   /**
>>    * \struct Accumulator
>>    * \brief RGB statistics for a given zone
>> @@ -160,7 +172,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 +247,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;
> 


More information about the libcamera-devel mailing list