MiniMax H3 Skin Finish Guided Surface / 引导滤波肤质收尾 (Advanced EXP)
The guided-filter skin finisher that refuses to eat the texture
- source_frames
- used_skin_mask
- audio
- surface_candidate
- source
- selected
- audio
- effective_mask
- rejected_mask
- difference
- report_json
If you've ever reached for a bilateral or guided filter to smooth skin without killing edges, you already know the trick - and this node is that idea taken seriously. The Guided Surface node is a clean-room skin-finish candidate built on a scalar-luma guided filter, designed to balance compact highlights, broad oily sheen, and blemishes while explicitly retaining source texture. It's the pack's most complete "matte and soften without the beauty-filter look" attempt.
How it works
A guided filter smooths based on a second signal's structure rather than blindly blurring - that's what keeps edges and detail where they belong. On top of that base, the node adds two bounded passes: compression for compact highlights (spots of shine), and a photographic luminance shoulder for broad highlights (whole-cheek sheen, which lives in the low frequencies and would survive a normal smooth). The v2 refinement the author shipped is the important part: broad highlight energy is measured as the positive difference from a mask-weighted local skin-illumination estimate, so uniformly bright skin receives no broad correction, and treatment fades to zero inside the hard mask edge (a two-pixel gate) so you don't get a tell-tale mask ring.
The controls, reduced to what you'll actually set:
amount(0.65) - global correction strength.surface_smoothing(0.7) andtexture_keep(0.85) - the smooth vs. texture trade. This pair is the heart of the node; if you want "matte the shine, keep the grain," these two are where you live.highlight_compression(0.65) for compact shine,broad_highlight_compression(0.45) for the wide sheen, gated bybroad_highlight_start/end(0.68 → 0.94) in luma.blemish_balance(0.35) - how hard to soften small blemishes versus keeping them.- The guard rail:
maximum_surface_delta,minimum_texture_ratio,maximum_mean_abs_change/maximum_peak_abs_change- frames that overstep bounce to exact source.
The input/output shape
Required: source_frames and used_skin_mask, plus the knob set. Optional audio. Outputs follow the family contract: surface_candidate, source, selected (bit-exact source until you flip accept_candidate), audio, effective_mask, rejected_mask, difference, report_json. Mask exterior, alpha, auxiliary channels, and audio are exact-source contracts - never touched.
Why you'd reach for it
When the plain frequency split or the specular split feels too weak and you want one node that handles both the shiny forehead and the pimples while keeping the skin reading as skin. The guided-filter lineage is exactly the "soften without losing edges" tool the post-processing playbook recommends for skin.
Honest expectations
T8's verification is again the adult in the room. The first surface version was measurably safe but "visually weak," and a full 960x544x124 stream got a blind review where source won overall, with the candidate winning nothing. The later v2/static candidate cleared the objective gates - zero fallbacks, exact audio, max temporal jump tiny - but review 8e89bff3bc95 came back all-ten-criteria-tied. Translation: this is a rigorously-constrained, display-referred finisher whose parameters have not been shown to produce a perceptible win. Use it as a principled option in your chain and judge for yourself; don't assume the defaults will visibly improve anything.
Installing it
Ships in the comfyui-minimax-h3-audio-T8 pack: ComfyUI Manager search "MiniMax H3 Audio T8", or clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git into custom_nodes, update ComfyUI core first, restart. No model downloads - CPU-only, chunked (chunk_frames default 2).
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| source_frames | IMAGE | — | |
| used_skin_mask | MASK | — | |
| amount | FLOAT | 0.650–1 | — |
| surface_smoothing | FLOAT | 0.700–1 | — |
| texture_keep | FLOAT | 0.850–1 | — |
| highlight_compression | FLOAT | 0.650–1 | — |
| broad_highlight_compression | FLOAT | 0.450–1 | — |
| broad_highlight_start | FLOAT | 0.680–0.99 | — |
| broad_highlight_end | FLOAT | 0.940.01–1 | — |
| blemish_balance | FLOAT | 0.350–1 | — |
| surface_radius_percent | FLOAT | 2.00.1–5 | — |
| maximum_radius_px | INT | 321–128 | — |
| edge_epsilon | FLOAT | 0.00250.000001–0.1 | — |
| edge_protection_scale | FLOAT | 0.0550.001–0.5 | — |
| highlight_threshold | FLOAT | 0.0060–0.1 | — |
| blemish_threshold | FLOAT | 0.0080–0.1 | — |
| maximum_surface_delta | FLOAT | 0.0800–0.25 | — |
| minimum_texture_ratio | FLOAT | 0.820–1 | — |
| minimum_reference_texture | FLOAT | 0.0030–0.1 | — |
| maximum_mean_abs_change | FLOAT | 0.0350–0.25 | — |
| maximum_peak_abs_change | FLOAT | 0.180–1 | — |
| minimum_mask_area | FLOAT | 0.00010–0.25 | — |
| maximum_mask_area | FLOAT | 0.500.05–1 | — |
| maximum_new_clipped_fraction | FLOAT | 0.00050–0.25 | — |
| clipping_epsilon | FLOAT | 0.00390.0001–0.05 | — |
| chunk_frames | INT | 21–16 | — |
| accept_candidate | BOOLEAN | false | False keeps the exact source selected. Enable only after labelled full-video review and downstream Texture/Safety gates. |
| audioopt | AUDIO | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| surface_candidate | IMAGE | — |
| source | IMAGE | — |
| selected | IMAGE | — |
| audio | AUDIO | — |
| effective_mask | MASK | — |
| rejected_mask | MASK | — |
| difference | IMAGE | — |
| report_json | STRING | — |