Compensate Projector Blacklevel with Calibrator
In a blended multi-projector setup, the overlap regions are never truly black: each projector leaks some light even on a black image, so overlaps sit visibly brighter than the rest of the screen. This procedure measures that residual light with the calibration cameras and builds a correction image that lifts the darker areas to match, so the screen reads as one even surface.
Decide whether you need this at all — black level correction is optional. Content that is continuously bright does not need it: nobody is looking at the black floor of an image that is never black. It earns its cost on dark content, where the overlaps read as visibly brighter patches on an otherwise black screen.
There is also no by-hand alternative worth attempting. DLP projectors emit bright but unreachable pixels outside the usable pixel area, so the content side cannot compensate for light the content cannot address — the correction has to be measured from what a camera actually sees on the screen. That is why this procedure is as involved as it is.
Requires the camera-based calibration system (Calibrator) installed on the server and correctly set up. The geometric calibration must be perfect, and a fresh calibration must be run before every black level correction — with blending included in the calibration update.
On an imperfect screen it helps to reduce meshStepRangeX and meshStepRangeY for both projector and camera in ProjectorLibrary.xml. A value of 2 generates a very high resolution warp mesh; the smaller the value, the longer the calculation takes.
Before you start
The projection and calibration must already be perfect. Beyond that:
-
Run the whole system at 10 bit colour depth for best results. At 8 bit, enable Enable Debanding in Backstage's Blending → Blending and Blending → BlackLevel properties.
-
Output Full range signals — 0–1023 at 10 bit, 0–255 at 8 bit — in the graphics driver properties. Limited range is not supported.
-
In Backstage, the render group should have blending on and brightness correction enabled, if you use it.
The room must be completely dark. You are measuring how much light a projector emits while showing black, and the cameras cannot tell that light apart from anything else reaching the screen. Any ambient light — a work light, a door left open, daylight through a gap — is measured along with the projector and ends up in the correction image.
Darkness alone is not enough: the light must also stay constant for the whole run. The procedure takes photos over many iterations, minutes apart, and compares them against each other. Light that changes between two photos corrupts the result even if the room was dark in both.
Prepare Calibrator
1. Black level parameters
Set these in the Calibration node of your project:
-
blackLevelProjectionSize— typically the content resolution. With mechanical masks a lower resolution is fine, since projector edges do not need hitting exactly, and it avoids fine noise on screen. A good starting point is the content resolution divided by 4 — 1024 × 1024 in this case. -
blacklevelCurrentStepSizeandblackLevelInitialStepSize— larger values run faster but can introduce noise. Start at 32 and reduce to 8 if the final correction image shows adjacent light and dark pixel clusters. -
blacklevelMinimalStepSize— the final step size. Use 1 for 10 bit, 2 for 8 bit. Raise it to stop the process earlier when the result is already good at a larger step. -
blackLevelFilterRadius_1andblackLevelFilterRadius_2— set both to 0.
Because of a current limitation, blackLevelProjectionSize must be square.
2. Cluster node
Set up multicastInterface and networkInterface under Cluster → Node, and set mode and role as well.
3. Displays, per projector
Set up Cluster → Node → Displays for every projector. The coloratorDisplay name is what appears in the black level dialog, and it must contain no spaces.
Repeat for all projectors.
4. Blending settings
Under Project → VideoChannels → GlobalBlending:
-
Type—BLENDTYPE_AUTOMATIC -
createClipImage—false, unless you need it
Under Project → VideoChannels → Mapping → Blendmask:
-
blendimageIs16bit— must beTRUE -
the file name under
urlmust end in.png, which is what supports 16 bit -
generatePrewarpedImage— must beTRUEfor the first run
Disable generatePrewarpedImage after the first run. Those blend images exist only to avoid an error during black level calculation — they are not used in the Calibrator/Backstage workflow, and regenerating them on every alignment run costs time for nothing.
Finally, create a BlacklevelCorrection node at Project → VideoChannels → Mapping.
Masks: screen border, objects and halos
The camera masks from the normal procedure are not applied here. Two separate masks are used instead.
screenFillmentMask.png
Defines the pixels visible on screen, acting much like the clip image by bounding the area for black level correction. For a dome this is a white circle on black, generated automatically if it does not already exist; for every other screen it defaults to full white.
This mask must be correct — otherwise the saturation calculated during calibration never reaches 100 %. Make it exactly the screen border, or very slightly larger.
cutoutMask.png
Marks areas that should be interpolated from neighbouring corrections instead of measured: along the screen border to avoid artefacts, where objects block the camera's view of the screen, or where projector halos appear in the camera image.
Always draw the cutout mask slightly smaller than the screen mask.
Both masks can be produced like the clip image: project white, use Stitch camera pictures in screen space from the Cameras node, and start from that image.
Use only RGB 0 (true black) and RGB 255 (true white) in the mask files, saved as 24-bit PNG, and switch off anti-aliasing in your editing tool. Intermediate greys are not valid mask values.
Place the finished masks in brightnessMeasurement\ — the path defined by brightnessPhotoDirectory under Project → Calibration.
Open the black level dialog
In Calibrator, click the black level correction icon — the seventh from the left.
Prepare the measurement
On the left, assign the Colorator projector IDs to the Backstage projector names.
The first time — and again after every camera calibration for the geometric auto-alignment — click Prepare data. It creates the files in config\calibration\forCameraStitching\ used to stitch the camera images together.
On the right, set the camera settings:
-
Aperture 10
-
Exposure 13 s
-
ISO 800
On a first run, click Calibrate cameras. The projection shows a white and a dark grey image while the cameras take pictures, and the camera gain curves are calculated and stored as <CAMERA-NAME>.cam in the colorMeasurement or cameraCalibration folder. Once calibrated, the cameras do not need it again on later runs.
Then click Perform initial measurement. The black levels should be clearly visible in the Measurement photo — neither too bright nor too dark. Adjust the camera exposure time until they look like this:
The noise around the edge of that image comes from cutoutMask.png, applied here to avoid artefacts along the screen border and drawn slightly smaller than the screen. screenFillmentMask.png is applied too, slightly larger than the screen.
Run the iterative correction
-
Adjust the Target minimum slider and click Calculate target until the correction target image shows a homogeneous dark area. Some white pixels are acceptable in the Reference area for stabilization image. Keep the target as low as possible — it defines the grey level on screen.
-
Optionally, adjust Target minimum and Calculate target again until the one or two brightest areas of the projection show as white in the reference area image, then click Fix current reference area. That prevents the brightest area of the projection being brightened further.
-
Press the Save icon at the top left, then click Do ALL iterations. Calibrator starts taking photos, beginning with large steps and ending with small ones — the sizes set in the parameters above.
To continue an interrupted run, reopen the dialog, press Load last state from files and click Do ALL iterations again.
During the process the saturation climbs towards 100 %, then the step size decreases and saturation restarts from 0 % — once per step size:
Watch the screen as it runs: the correction is often already good at a step size of 4 or 2, and that value can then be set as the minimal step size to speed up future calibrations. After around 21 iterations it finishes.
The final correction file is typically written to:
C:\BRAINSALT\Calibrator\_config\brightnessMeasurement\correction-final.png
Load the correction into Backstage
Set Backstage to load that file as the black level correction file:
The correction file often carries some noise, so enable the black level image blur and adjust the filter scale for the best result on screen. At 8 bit, also tick Enable Debanding.
The colour correction sliders adjust the colour of the black level offset and the general brightness of the correction.
The Threshold parameter
Internally two gamma curves are applied to the content: the original linear one, and one that shifts the projector's gamma curve to start at the black-level-corrected value. Backstage interpolates between them, and Threshold sets the content value at which the original linear curve is used fully.
Reducing Threshold to 0 disables black level correction entirely. A very low value increases contrast but can make the projector edges visible in some content. The parameter is also available on the Scene:Blending node, so it can be driven per scene — full correction where black level matters, full contrast where it does not.
A corrected, re-stitched image looks like this. The camera sees some colour differences in this setup with 8-bit projectors, but they were very hard to see on the screen in reality.
Adjusting during playback
Black level correction can be adjusted live through the Scene:Properties node — for instance disabling it in scenes where black level is not an issue, to gain contrast:
From Conductor, set up a numeric channel with a value range of 0–1 and three decimal places, and send it to the server IP — or localhost, as in this screenshot — on a chosen port:
In Backstage, receive it with a UDP receiver and use the second input of a Datatype:Converter node to convert the received bytes to a float:
Command line
Calibrator can run the whole black level process unattended with -blacklevel:
Calibrator.exe -blacklevel -config "c:\BRAINSALT\Calibrator\_config\config.xml"
An unattended run has no one watching the room. Make sure the darkness is guaranteed for the whole run — house lights locked out, no cleaning or access scheduled — before triggering it.
Common Mistakes
-
Saturation never reaches 100 % —
screenFillmentMask.pngis wrong. It has to match the screen border, or be very slightly larger. -
The correction image shows light and dark pixel clusters — the step size is too large. Reduce
blacklevelCurrentStepSizeandblackLevelInitialStepSizefrom 32 towards 8. -
The correction does not fit the projection — the geometric calibration was not re-run before this procedure. A fresh calibration is required every time, with blending included.
-
The correction is uneven, or does not match what you see — light reached the screen during the run. Either the room was not completely dark, or the lighting changed part way through, so the photos are not comparable.
-
A projector is missing from the dialog — its
coloratorDisplayname contains a space. -
Banding appears on screen — the system is running at 8 bit without Enable Debanding, or the driver is putting out limited rather than full range.
-
Every alignment run is slow —
generatePrewarpedImagewas left enabled after the first run, so unused blend images are regenerated each time.
Related
Dome Projection with Spherical Distortion Lenses and Calibrator — calibration settings for domes
Output Warping — the warping this correction sits on top of



















