Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
isp:automatic_white_balance [2018/06/14 14:47] – [Sample implementation in C++] Igor Yefmov | isp:automatic_white_balance [2019/05/09 00:43] – [Calculate color properties] Igor Yefmov |
---|
- Perform the [[https://en.wikipedia.org/wiki/YUV#HDTV_with_BT.709|RGB->Y'UV]] conversion | - Perform the [[https://en.wikipedia.org/wiki/YUV#HDTV_with_BT.709|RGB->Y'UV]] conversion |
- Calculate the pixel's "saturation" using the following formula: | - Calculate the pixel's "saturation" using the following formula: |
- ''(|U((in range -127..+127))| + |V((in range -127..+127))|) / Y((in range 0..255)) < threshold / 100''((convert threshold from percent value to relative value, i.e. convert, say, ''13%'' to ''0.13'')) | - \(\frac{|U| + |V|}{Y} < threshold, U \in [-127..+127], V \in [-127..+127], Y \in [0..255], threshold \in [0..1]\) |
- Of course one should be careful about dividing by ''0'' so first check if the ''Y'' is not ''0'' ;-) | - Of course one should be careful about dividing by ''0'' so first check if the ''Y'' is not ''0'' ;-) |
- If the ''Y'' value is **not** ''0'' **and** ''threshold'' comparison yielded ''true'' - add that pixel's ''U'' and ''V'' components to our running totals and increment the total number of "good" pixels by ''1'' | - If the ''Y'' value is **not** ''0'' **and** ''threshold'' comparison yielded ''true'' - add that pixel's ''U'' and ''V'' components to our running totals and increment the total number of "good" pixels by ''1'' |
==== Calculate color properties ==== | ==== Calculate color properties ==== |
| |
Now that we have our data set we can figure out what our picture looks like from the color balance point of view. For that we just calculate the average values of ''U'' and ''V''. The simplest approach is to calculate the [[https://en.wikipedia.org/wiki/Mean#Arithmetic_mean_(AM)|arithmetic mean]] value, but other formulae may provide more accurate results. | Now that we have our data set we can figure out what our picture looks like from the color balance point of view. For that we just calculate the average values of \(U\) and \(V\). The simplest approach is to calculate the [[https://en.wikipedia.org/wiki/Mean#Arithmetic_mean_(AM)|arithmetic mean]] value, but other formulae may provide more accurate results. |
| |
At the end of this step we have the following 3 sets of numbers: | At the end of this step we have the following 3 sets of numbers: |
- "Main results" are the averages of ''U'' and ''V'' - these tell us how far off the picture is from being considered to be the "grey world" | - "Main results" are the averages of \(U\) and \(V\) - these tell us how far off the picture is from being considered to be the "grey world" |
- Calculate the "average" ''R'', ''G'', and ''B'' values from ''U'' and ''V''. | - Calculate the "average" \(R\), \(G\), and \(B\) values from \(U\) and \(V\). |
- Use the ''Y'' from [[#Collect statistical data set|previous step]] (if it was collected) or just go with the value of ''100'' which is hopefully a good representation of a well-adjusted overall brightness | - Use the \(Y\) from [[#Collect statistical data set|previous step]] (if it was collected) or just go with the value of \(100\) which is hopefully a good representation of a well-adjusted overall brightness |
- Calculate the two ratios that represent how far off the ''Red'' and ''Blue'' colors are from the ''Green''((we use a fixed value of ''Green'' and never adjust it for color normalization)). Those ratios are ''R/G'' and ''B/G'' | - Calculate the two ratios that represent how far off the ''Red'' and ''Blue'' colors are from the ''Green''((we use a fixed value of ''Green'' and never adjust it for color normalization)). Those ratios are \(^R/_G\) and \(^B/_G\) |
| |
==== Figure out the adjustment ==== | ==== Figure out the adjustment ==== |