ECHO Reference Match / 回响·参考追色
Make a thousand product shots look like one photo shoot — no GPU needed
- source
- reference
- source_background_mask
- reference_background_mask
- protect_mask
- corrected
- background_mask
- review_report
This is the node for when your images are right, just not consistent. You have ten shots of the same jacket - some on location, some under studio strobes, a few straight out of a generator - and they all look like different products. ECHO Reference Match (displayed as "ECHO Reference Match / 回响·参考追色") takes one reference image and drags the background and the person in your source toward its color and exposure, in a single deterministic pass. No diffusion model, no NVIDIA card, nothing uploaded anywhere. ECHO is a color-consistency engine aimed at e-commerce and fashion SKU work; this node is its ComfyUI front door.
回响 means "echo" - your images echo one visual standard. The author is a solo dev (x9c4gqtpv4-coder); the pack is new with essentially no community footprint yet, so treat it as promising rather than proven.
How it works
Most color-match nodes in ComfyUI do a whole-image Reinhard-style statistics transfer - push the source's mean and variance toward the reference's and call it done (the post-processing folks know the one from spacepxl). ECHO is a step above that, and deliberately conservative:
- It builds a color profile from the reference - background statistics measured in OKLab, which tracks human perception of lightness and chroma far better than RGB.
- It splits your source into background and person via a heuristic studio-background estimate.
- It measures the gap between source and reference regions, then applies a bounded, one-pass color transform. Background is graded toward the reference's background; in the default mode the whole person - skin, hair, clothing - shares one smooth transform so you don't get color blocks at your neckline.
The transform is amplitude-limited to protect highlights, shadows, and neutrals, edges are soft-masked, and protected pixels don't move. It's graded, not regenerated - no re-roll lottery, no texture rewriting.
The inputs that matter
Only source and reference (both IMAGE) are strictly required. Of the rest, beginners actually set two or three:
strength(default 0.85): blends from identity at 0 up to the full bounded candidate at 1. Start at 0.5 if you're nervous.adjustment_mode:background + person(default) orbackground only, which leaves every non-background pixel byte-identical.transform_path: leave onauto- it compares a conservative global fit against a spatial "surface" fit and picks whichever scores better.globalforces the safest path.
mask_backend is heuristic by default: deterministic, cross-platform, pure Python. auto only helps if you've separately built the optional macOS Vision helper - otherwise it just falls back to heuristic.
Three optional MASK inputs do the heavy lifting on hard images: source_background_mask and reference_background_mask let you supply reviewed background masks (white = background), and protect_mask keeps white pixels exactly as they are - that's your book, logo, or garment tag shield.
What comes out
Three outputs. corrected (IMAGE) is the candidate - wire it to Save Image. background_mask (MASK) shows you what ECHO decided was background, worth previewing once. review_report (STRING) is JSON describing what the engine did. Note the philosophy: every result is flagged "status": "review" and "approved": false. The node never auto-approves; sign-off stays a human decision.
Install
The lightweight kind. Clone it, install two pure-Python deps with ComfyUI's own Python, restart:
cd ComfyUI/custom_nodes
git clone https://github.com/x9c4gqtpv4-coder/ECHO.git
/path/to/comfyui/python -m pip install -r ECHO/requirements.txt
That's numpy and Pillow - no model downloads, no torch install needed (ComfyUI already ships torch; the node only uses it to hand tensors back). ComfyUI Manager also finds it if you search "ECHO". One catch: the engine needs Python ≥ 3.11 and < 3.13, so an older portable ComfyUI on 3.10 will refuse the requirements.
Common issues
- Clipped/weird results on cluttered scenes. The heuristic assumes a fairly clean product background. For complex shots, connect reviewed background masks - the README is blunt that you shouldn't lean on lightweight guessing there.
- "Mask geometry does not match image geometry." Masks must be the exact pixel size of their image. ECHO deliberately refuses to silently resize a mask because that would shift protection edges - resize it yourself first.
- Repeated runs feel slow? The reference profile is cached in memory (up to eight, keyed by reference pixels), so a batch against one reference only analyzes it once.
Honest boundary: this fixes relative consistency - getting everything onto one look - not recovering absolute physical colors from a casual sRGB shot. If a garment color must be exact, you still want a physical color card or a human-approved anchor, not any color-match node.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| source | IMAGE | — | |
| reference | IMAGE | — | |
| strength | FLOAT | 0.850–1 | — |
| adjustment_mode | COMBO | background + person | 2 options: background + person, background only |
| transform_path | COMBO | auto | 3 options: auto, global, surface |
| mask_backend | COMBO | heuristic | 2 options: heuristic, auto |
| source_background_maskopt | MASK | — | |
| reference_background_maskopt | MASK | — | |
| protect_maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| corrected | IMAGE | — |
| background_mask | MASK | — |
| review_report | STRING | — |