MiniMax H3 Skin Finish Dichromatic Specular / 二色反射高光抑制 (Advanced EXP)
Dichromatic specular attenuation
- source_frames
- used_skin_mask
- audio
- specular_candidate
- source
- selected
- audio
- effective_mask
- rejected_mask
- difference
- report_json
Most skin-smoothing tools bluntly blur anything bright. The Dichromatic Specular node is the one that stops and asks a physics-adjacent question first: is this bright patch actually a specular highlight - the kind you'd want to attenuate - or is it just bright skin, which you should leave alone? It's a clean-room, display-referred approximation of that judgment, and it's one of the more interesting experiments in the pack precisely because it tries to be conservative about what counts as shine.
How it works
The node describes its own contract: it requires a neutral-illuminant dichromatic specular estimate and local chroma dilution before it will touch a pixel. The dichromatic model, simplified, says a specular reflection roughly preserves the light source's color (often near-neutral) while the diffuse skin underneath carries the chroma. So the node looks for pixels that are bright, have a positive achromatic specular estimate, and sit where chroma is locally diluted - meaning the highlight has washed out the local color. Same-chromaticity bright skin (a uniformly lit pale cheek, for example) is intentionally left unchanged, because that's not a specular separation, that's just skin.
The control set is intimidatingly long, but the ones you'd actually touch:
amount(0.8) andspecular_strength(0.8) - how much correction and how hard the specular estimate pushes.specular_threshold_linear/specular_softness_linear(0.004 / 0.03) - the brightness floor and falloff for "this is a highlight."chroma_dilution_threshold/chroma_dilution_softness- the local-color-washout test.minimum_direction_cosine(0.75) - consistency with the masked diffuse-colour direction; this is the gate that stops near-neutral diffuse skin from being treated (that problem is "ill-conditioned," per the author).- The guard rail:
minimum_texture_ratio,maximum_peak_abs_change,maximum_new_clipped_fraction, etc. - the same bounded-change/texture/clipping gauntlet the other candidates run.
The input/output shape
Required: source_frames, used_skin_mask, and a mountain of floats; optional audio. Outputs mirror the family pattern: specular_candidate, source, selected (source by default), audio, effective_mask, rejected_mask, difference, report_json. Frames that fail any gate bounce to source, and accept_candidate (false) is the only path to the candidate.
Why you'd reach for it
For greasy, sweaty-skin footage where a broad blur would flatten the face. Its whole design is to remove only the highlight layer, preserving the diffuse tone underneath - which is exactly what you want for "matte the shine, keep the skin." It's also frame-independent and CPU-only, so it runs chunked (chunk_frames default 2) without loading H3 or SAM.
Honest expectations
T8's validation is characteristically blunt: a real 960x544x124 run passed all the mechanical gates, but the blind human review had source winning seven criteria, candidate winning zero, and the reviewer's post-reveal verdict was essentially "looks the same." So this is an experiment with no perceptible-benefit claim - the author says so explicitly. Reach for it if you want to understand the approach or need a principled, safely-bounded highlight attenuator in the chain; don't reach for it expecting a visible transformation out of the box.
Installing it
Standard pack install: ComfyUI Manager → "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 extra model files - this one is pure CPU image math.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| source_frames | IMAGE | — | |
| used_skin_mask | MASK | — | |
| amount | FLOAT | 0.800–1 | — |
| specular_strength | FLOAT | 0.800–1 | — |
| diffuse_radius_percent | FLOAT | 2.50.1–8 | — |
| maximum_radius_px | INT | 481–192 | — |
| specular_threshold_linear | FLOAT | 0.0040–0.25 | — |
| specular_softness_linear | FLOAT | 0.0300.001–0.5 | — |
| chroma_dilution_threshold | FLOAT | 0.00150–0.25 | — |
| chroma_dilution_softness | FLOAT | 0.0200.001–0.5 | — |
| minimum_diffuse_chroma | FLOAT | 0.0080–0.25 | — |
| diffuse_chroma_softness | FLOAT | 0.0500.001–0.5 | — |
| minimum_direction_cosine | FLOAT | 0.75-1–0.99 | — |
| maximum_surface_delta | FLOAT | 0.1000–0.25 | — |
| minimum_texture_ratio | FLOAT | 0.860–1 | — |
| maximum_texture_ratio | FLOAT | 1.101–2 | — |
| 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 |
|---|---|---|
| specular_candidate | IMAGE | — |
| source | IMAGE | — |
| selected | IMAGE | — |
| audio | AUDIO | — |
| effective_mask | MASK | — |
| rejected_mask | MASK | — |
| difference | IMAGE | — |
| report_json | STRING | — |