Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
isp:brightness [2023/09/10 18:31] – [Integer arithmetic] Igor Yefmov | isp:brightness [2023/09/10 20:56] – [Algorithm] Igor Yefmov | ||
---|---|---|---|
Line 6: | Line 6: | ||
===== In RGB color space ===== | ===== In RGB color space ===== | ||
- | The mathematically correct way to do the brightness is to first convert into HSL color space, adjust the L (luma) component, and then convert back into RGB. That gives the correct result but costs way too many transistors and cycles. So we've got improvise! | + | The mathematically correct way to do the brightness is to first convert into HSL color space, adjust the L (luma) component, and then convert back into RGB. That gives the correct result but costs way too many transistors and cycles. So we've got to improvise! |
- | Here's the algorithm to follow, assuming \(R, G, B \in [0..4095] and br \in [-1024..+1023]\): | + | ==== Algorithm ==== |
+ | Here's the algorithm to follow, assuming \(R, G, B \in [0..4095]\) and \(br \in [-1024..+1023]\): | ||
- calculate luminosity | - calculate luminosity | ||
- | - figure out the slope for each components based on whether luma is below or above 50% | ||
- adjust the brightness additively and clamp the value to range \([0..4095]\) | - adjust the brightness additively and clamp the value to range \([0..4095]\) | ||
+ | - figure out the slope for each components based on whether luma is below or above 50% and set chroma components to values that correspond to that 50% luma | ||
+ | - figure out if the new luma is going to cross the 50% boundary and if so - "flip the slopes" | ||
- recalculate RGB components | - recalculate RGB components | ||
+ | |||
+ | ==== Calculation reference ==== | ||
To calculate luminosity we just find the max and min of the triplet and get a simple average: | To calculate luminosity we just find the max and min of the triplet and get a simple average: | ||
Line 25: | Line 29: | ||
\end{cases} | \end{cases} | ||
\] | \] | ||
- | |||
- | Similarly find the \(k_G\) and \(k_B\) for green and blue components respectively. | ||
Brightness adjustment is a trivial addition, clamping the value to its proper limits: | Brightness adjustment is a trivial addition, clamping the value to its proper limits: | ||
Line 35: | Line 37: | ||
\] | \] | ||
- | Apply the new \(L`\) to R component and clamp the result: | + | Applying |
\[ | \[ | ||
- | R` = k_R \times | + | R` = k_R * (L` - 2047) + R \\ |
R` \in [0..4095] | R` \in [0..4095] | ||
\] | \] | ||
- | Similarly perform calculations for green and blue components. | + | \(G\) and \(B\) calculations are similar to \(R\). |
===== In HSL color space ===== | ===== In HSL color space ===== |