Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| isp:brightness [2023/09/10 18:32] – [In RGB color space] Igor Yefmov | isp:brightness [2023/09/10 21:49] (current) – [Calculation reference] 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: | ||
| \[L = \frac{min(R, | \[L = \frac{min(R, | ||
| + | |||
| + | Brightness adjustment is a trivial addition, clamping the value to its proper limits: | ||
| + | |||
| + | \[ | ||
| + | L` = L + br \\ | ||
| + | L` \in [0..4095] | ||
| + | \] | ||
| The slope \(k_R\) for the red component calculation depends on whether \(L\) is above or below the middle: | The slope \(k_R\) for the red component calculation depends on whether \(L\) is above or below the middle: | ||
| Line 22: | Line 33: | ||
| \begin{cases} | \begin{cases} | ||
| R / L & \text{if} \; L \leq 2047 \\ | R / L & \text{if} \; L \leq 2047 \\ | ||
| - | \frac{R - 2047}{L - 2047} & \text{if} \; L > 2047 | + | \frac{R - 4095}{L - 4095} & \text{if} \; L > 2047 |
| \end{cases} | \end{cases} | ||
| \] | \] | ||
| - | Similarly find the \(k_G\) and \(k_B\) for green and blue components respectively. | + | Finding the " |
| - | + | \[ | |
| - | Brightness adjustment is a trivial addition, clamping the value to its proper limits: | + | R = |
| + | \begin{cases} | ||
| + | k_R * 2047 & \text{if} \; L \leq 2047 \\ | ||
| + | 4095 - k_R * 2047 & \text{if} \; L > 2047 | ||
| + | \end{cases} | ||
| + | \] | ||
| + | If we are crossing the middle luma boundary as the result of this adjustment - flip the slope: | ||
| \[ | \[ | ||
| - | L` = L + br \\ | + | k_R = 2 - k_R |
| - | L` \in [0..4095] | + | |
| \] | \] | ||
| - | Apply the new \(L`\) to R component and clamp the result: | + | Applying |
| \[ | \[ | ||
| Line 42: | Line 58: | ||
| \] | \] | ||
| - | Similarly perform calculations for green and blue components. | + | \(G\) and \(B\) calculations are similar to \(R\). |
| ===== In HSL color space ===== | ===== In HSL color space ===== | ||