The black level is the signal level you get in the absence of light. It's a positive value because:
- the value is not the same for every sensel (hence the need for dark frame subtraction)
- values below black level do appear (because of the additive noise); a noise reduction or a frame stacking step can make use of those sub-black values.
"Pushing" the black level to a lower value would be the same as changing the input curve (rendering deep shadows in a lighter tone, rather than black). You probably liked the look, but there's no additional dynamic range to gain this way.
If the black level is incorrectly set above the real value, you will see additional detail from lowering it. Otherwise, there's little or no point in changing it.
Changing the black level also changes the colors in shadows, because the white balance multipliers are usually not equal. If you set all of them to 1, the color cast introduced by changing black level disappears.
On the other hand, there might be additional dynamic range to gain from pushing white level to a higher value. With recent versions, this additional gain will be less than 0.02 EV.
* White level
* With PREFERRED_RAW_TYPE set to CCD, most cameras appear to clip above 16300
* (most of them actually use the full range, until 16382)
* one size fits all: 16200 may sacrifice up to 0.02 EV of highlights
* that is, log2((16382-2048) / (16000-2048))
#define WHITE_LEVEL 16200
However, if you find pink highlights with this value, I'd be interested to see a sample MLV.
@Danne: pushing white to 16383 may be a little optimistic; there are exposure settings that clip to this value and there are exposure settings that clip to a slightly lower level (including 5D3). Usually, if white level is above clipping point, you get pink highlights; but in some cases, the result is pretty good anyway, so it's a bit of an edge case.
You can check the white level in the samples in this thread: http://www.magiclantern.fm/forum/index.php?topic=11899.0
e.g. with octave (requires read_raw.m
a = read_raw("frame.dng");
prctile(a(:), [90 95 99 99.9 99.99 99.999])
Note the max value from the image can exceed the clipping point from one sensel (happens with hot pixels), that's why I prefer checking it with percentiles.