Nodes/Atlas Camera/Atlas matrixZone Stitch πŸ”²
ComfyUI Node

Atlas matrixZone Stitch πŸ”²

The seams are tonal, so fix them in log2

By mikejamesvfxΒ·Created 4 months agoΒ·Updated 17 days agoΒ· 3
Atlas matrixZone Stitch πŸ”²
  • hdr
  • matrixzone
  • sdr_plate
  • project
  • preview
  • exr_path
  • report
β—„anchortrueβ–Ί
β—„split_px0β–Ί
β—„colorspaceACEScgβ–Ί
β—„filename_prefixatlas/hdr_plateβ–Ί
β—„destripetrueβ–Ί
β—„detail_from_sdrtrueβ–Ί

Stitching tiles is normally a luminance-matching problem, and normally people solve it by feathering until the seam stops being obvious. Atlas matrixZone Stitch πŸ”² does something better, because it knows what kind of seam it's facing: an SDRβ†’HDR conversion's seam risk is tonal. Each zone guesses its own highlight radiance, independently. Two zones of the same sky can decide the sun is a stop and a half apart.

So with anchor on - which it is by default - each zone's low-frequency log2 radiance is replaced by the global pass's, and the zones carry only detail. Seams are then feathered in log2 space and the padding is cropped. The pack's own numbers: on the first live 8K run this took sky seams from 0.29 to 0.04 stops.

The two cleanup passes, and what they cost

destripe (default on, needs sdr_plate) removes faint vertical stripes the conversion adds in every zone - measured at about 0.018 stops on LTX-2.5, and present even without zoning. It's measured against the SDR input per band, high-passed at 257 px, and divided out in two passes; on an 8K plate that's 0.084 β†’ 0.016 stops. A second local pass catches stripes that only appear in part of a band, or in bright sky.

detail_from_sdr (default on, needs sdr_plate) is the more opinionated one: it keeps the conversion's radiance but takes the picture's structure from the SDR. The log ratio of hdr over sdr is smoothed by a guided filter on the SDR's log luminance (r 64), so stripes of any width up to the window go away and edges keep no halo, and clipped highlights keep the HDR's pixels. The cost is real and the docs name it: model-reconstructed fine detail in unclipped areas - including its JPEG-block cleanup - is replaced by the SDR's detail.

Inputs and outputs

Required: hdr (the LTX chain's hdr_linear, ACEScg linear, as a list) and matrixzone (from AtlasMatrixZoneSplit - keep the handle, the stitch needs the plan).

Optional: anchor (true); split_px (0 = the seam overlap - the anchor's low-pass scale in render px); colorspace (ACEScg, and it genuinely must be - aliases lin_ap1, ACES - ACEScg, lin_ap1_scene are accepted, anything else is refused rather than mis-tagged, because LTX hdr_linear is ACEScg and the stitch only produces ACEScg); filename_prefix (atlas/hdr_plate); destripe (true); sdr_plate; detail_from_sdr (true); project (an AtlasProject - writes the EXR into the shot's plates/ lane, superseding the prefix's folder).

Outputs: preview (tonemapped), exr_path (STRING), report. It's an output node, so the EXR lands when you queue.

Install

cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git

Or Manager β†’ atlas-camera. Restart. No pip step for the node - writing the EXR needs OpenImageIO, which is the [oiio] extra if you're installing the package rather than cloning.

The lane: ComfyUI V135+, the full LTX-2.5 file set, and ComfyUI-LTXVideo if the LTXV* nodes load red. If you install Atlas's [neural] extra for the learned solve, cap kornia<0.8.3 in the same environment - 0.8.3 dropped a re-export that ComfyUI-LTXVideo imports by name, and the resulting ImportError blames LTXVideo, not the thing that actually pulled the new version.

When it refuses, and why you should be glad

It refuses an empty or non-finite zone result or global pass, and a short zones_as_frames sequence, naming the cause instead of stitching around a hole. A failed EXR write is line 1 of the report. Per-seam log2-luminance disagreement is measured before and after the anchor, and any seam that fails the step test gets flagged by name, never blended away - structure on the line also scores high, so the flag means "go look", not "broken".

Three honest limits. The model occasionally invents soft ~30 px spots on flat sky that aren't in the SDR and aren't removed automatically - comp may still want paint fixes. Gate on the delivered plate, the decoded EXR, not the float in memory. And the EXR is labelled a model reconstruction, not photographed HDR: highlights above 1.0 are inferred. Same licence caveat as the split node - LTX-2.x is revenue-capped at US$10M, free below it.

CategoryAtlas/10 Β· Export

Inputs (10)

NameTypeDefaultDescription
hdrIMAGELTX hdr_linear (ACEScg linear), as a list.
matrixzoneATLAS_MATRIXZONEβ€”
anchoroptBOOLEANtrueTake each zone's low frequencies from the global pass.
split_pxoptINT00–1024Anchor low-pass scale in render px. 0 = the seam overlap.
colorspaceoptSTRINGACEScgEXR colorspace tag. Must be ACEScg (aliases: lin_ap1, ACES - ACEScg, lin_ap1_scene): LTX hdr_linear is ACEScg and the stitch only produces ACEScg, so any other value is refused rather than mis-tagged.
filename_prefixoptSTRINGatlas/hdr_plateβ€”
destripeoptBOOLEANtrueRemove vertical stripes the conversion added (needs sdr_plate).
sdr_plateoptIMAGEThe SDR plate the split was given.
detail_from_sdroptBOOLEANtrueRebuild unclipped areas as SDR x the conversion's smoothed (edge-aware) radiance ratio: no model stripes, no halos. Clipped highlights keep the HDR's pixels. Needs sdr_plate.
projectoptATLAS_PROJECTOptional delivery project from AtlasProject: writes the EXR into the shot's plates/ lane (supersedes filename_prefix's folder).

Outputs (3)

NameTypeDescription
previewIMAGEβ€”
exr_pathSTRINGβ€”
reportSTRINGβ€”