Nodes/ComfyUI ACES EXR Toolkit/Synthetic HDR Expansion πŸš€
ComfyUI Node

Synthetic HDR Expansion πŸš€

Turn SDR AI images into scene-linear light

By azhagurajpandiansΒ·Created 4 months agoΒ·Updated about a month agoΒ· 0
Synthetic HDR Expansion πŸš€
  • image
  • image
β—„boost_multiplier4.0β–Ί
β—„threshold0.70β–Ί

Here's the problem this node solves: your AI image is trapped in 0–1. FLUX and SDXL generate sRGB-encoded images where pure white is the brightest thing that exists - no headroom, no highlights above "white," nothing a 3D light or a comp can reach into. Synthetic HDR Expansion takes that SDR image and pushes it back into scene-linear float, reconstructing a highlight range that goes above 1.0. Out the other end you get a tensor with real HDR headroom, ready to be a 3D environment map or an element in a float pipeline.

It's the "πŸš€" node in the pack's marketing, and the reality is more modest and more useful than the rocket suggests. It does not hallucinate new detail. It can't - the bright pixels were already lost at capture. What it does is take the near-white pixels that do exist and lift them smoothly into a range above 1.0, so your highlights roll off naturally instead of sitting pinned at flat white. That's the entire job, and it does it well.

How it works

The pipeline, per the source: sRGB-decode the input to linear, compute luminance, then find every pixel whose luminance is above threshold (default 0.7 - i.e., the near-whites) and boost it by 1.0 + (luminance - threshold) * boost_multiplier. Below the threshold, nothing moves. Result: an image that's still linear and still correct in the shadows and midtones, but whose bright regions now carry values up past 1.0 instead of stopping there.

The two knobs:

  • threshold - where the reconstruction kicks in. 0.7 means "the top 30% of brightness starts getting lifted." Lower it and more of the image expands; raise it and only the purest whites do.
  • boost_multiplier - how aggressively the near-whites get lifted, default 4. Too low and the HDR is timid; too high and you get blown, artificial-looking speculars. This is the knob you tune by eye in the viewer.

The workflow it feeds

The README's own suggested chain:

AI Generator -> Synthetic HDR Expansion -> Nodex HDR Viewer -> Save EXR

Inspect with the viewer (drop the EV slider to see the reconstructed highlights roll off), then save as a 32-bit EXR. That's how a 2D AI image becomes an HDR light probe or a post-processable element without ever leaving ComfyUI.

Install

Same pack:

cd ComfyUI/custom_nodes
git clone https://github.com/azhagurajpandians/ComfyUI-ACES-EXR-Toolkit.git
python -m pip install -r ComfyUI-ACES-EXR-Toolkit/requirements.txt

Restart ComfyUI; it's under image/ACES + EXR.

Gotchas

Set expectations honestly: this is reconstruction, not resurrection. A completely clipped sky at 1.0 comes out as a smoothly-boosted bright region - useful as an env map, not a faithful recovery of what was actually there. And if the input is already clamped hard (lots of flat 1.0 pixels), the boost just moves a plateau upward, so you'll see banding in the viewer. Also worth knowing: the output is linear - preview it through a tone map or the HDR viewer, not the stock preview node, or it'll look dark and washed. That's not a bug; that's scene-linear light being honest about itself.

Categoryimage/ACES + EXR

Inputs (3)

NameTypeDefaultDescription
imageIMAGEβ€”
boost_multiplierFLOAT4.00–20β€”
thresholdFLOAT0.700–1β€”

Outputs (1)

NameTypeDescription
imageIMAGEβ€”