Color: HDR Merge (bracket)
Squeeze the Window and the Room Into One Frame
- images
- image
A single exposure can't hold a bright window and a dark interior at once, so you bracket - -2, 0, +2 EV - and then face the part everyone hates: merging them into something that doesn't look like a 2008 real-estate listing.
Color: HDR Merge (bracket) (JHPixelProHDRMerge) uses exposure fusion (Mertens, Kautz & Van Reeth 2007), not radiance-map HDR. That distinction is the whole personality of the node. It needs no exposure values, no camera response curve, and - most importantly - there is no tone-mapping step with sliders, because the output is already display-ready. Every pixel is a multi-resolution blend of the frames weighted by contrast, saturation and well-exposedness: the merge picks the parts of each shot that look best, rather than reconstructing light and then compressing it.
The result looks natural and, honestly, a bit flat. That's not a defect, it's the end of step one. Finish it with Auto Tone, ColorLab or Shadows/Highlights Pro.
What it does with your frames
Frames are sorted by brightness and the middle one becomes the reference. Order doesn't matter - dump them in any sequence.
align (default on) shifts each frame onto the reference with Ward's median-threshold-bitmap alignment (cv2.AlignMTB) on a ~1024 px proxy, translation only. A shift larger than 5% of the long edge is treated as a failed alignment and ignored, which is a sensible guard: better to leave a frame alone than to throw it a quarter-screen sideways.
deghost (default on) scales each frame to the reference brightness (median ratio over pixels well-exposed in both) and, where a frame still disagrees strongly - a person who moved, leaves in wind - substitutes the brightness-matched reference pixels with a soft edge. So nothing appears twice.
Then cv2.MergeMertens fuses the lot, on the CPU in float32.
Inputs and outputs
images - the bracket as one batch, 2 or more frames, any order. Use Batch Images or Load Image Batch to combine them; this node does not read a folder.
align and deghost, both booleans, both on by default.
Single output: image. There's no depth, no exposure map, no 32-bit float - display-ready sRGB, as promised.
The part that will annoy you
Alignment here is translation only. If the shots are rotated or scaled relative to each other - you turned the camera between frames - this can't fix it. The docs suggest running Auto Align on the frames first if you need to; honestly, at that point reshoot on a tripod or use a fast burst, because a rotation that needs aligning also means your framing drifted.
Peak RAM is about 6× the batch in float32, since it's all CPU-side OpenCV. Three 2 MP frames take about a second. Twenty-four-megapixel brackets will be slower and hungrier than the number suggests.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/jetthuangai/ComfyUI-JH-PixelPro.git
cd ComfyUI-JH-PixelPro
pip install -r requirements.txt # the Python that runs ComfyUI
ComfyUI Manager: search ComfyUI-JH-PixelPro → Install → restart → Add Node → ComfyUI-JH-PixelPro → color. Deps: kornia>=0.7, mediapipe>=0.10.33, opencv-python-headless>=4.8, scipy>=1.10; PyTorch from ComfyUI. Nothing to download, no models, no GPU required - this node is OpenCV end to end.
Where people get burned
- Two frames is possible; three is better. Three or more give smoother transitions between the weighted regions. A two-frame merge often shows a faint band where the weighting flips.
- Handheld with real movement.
deghosthandles a person walking through the frame; it does not handle you stepping sideways. Look at the deghosted areas at 100% before you ship. - Expecting a slider for the "HDR look". There isn't one, deliberately. If you want the crunchy over-processed look, that's a different (worse) algorithm; add contrast afterwards and take responsibility for it.
- Skipping the finish. A merged image alone is under-contrasted. Auto Tone or Shadows/Highlights Pro is not optional in the workflow the author describes, and they're right.
This is worth flagging in a broader sense: exposure fusion is one of the few places where a deterministic, twenty-year-old algorithm beats a generative approach outright. You could img2img your way to a "fixed" interior and lose the actual window view, or you could merge three frames and keep real photons. Node packs like this one exist to make the deterministic option convenient enough that people stop reaching for the sampler.
Pack: Apache-2.0, by JH (@jetthuangai), v1.10.0, 64 nodes, docs in English and Vietnamese with an example workflow per node. There's no Reddit discussion of the pack to check against - the name returns one unrelated browser extension in the corpus - so test it on your own bracket, which for an exposure-fusion node is the only honest benchmark anyway.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The bracketed shots as one batch (2 or more, any order). Use Batch Images or Load Image Batch to combine them. | |
| align | BOOLEAN | true | Line up hand-held shots (small shifts). |
| deghost | BOOLEAN | true | Where something moved between shots (people, leaves), use the middle exposure so nothing appears twice. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |