Pipeline limit
Fine hair against a busy background
The information is in your photo; our processing does not fully recover it. Better settings and hand repair genuinely help here.
What you see
Individual strands blur into one grey-edged clump. Some wisps vanish entirely; between the ones that survive, patches of the old background come along for the ride. The hairline can look like it was cut out with scissors while the rest of the edge looks soft.
Why it happens
The mask is not computed at your photo's resolution. Best Quality runs its model on a 512×512 square, and the mask that comes back is stretched to your image's real size afterwards — bilinear across the body, bicubic through the partly-transparent edge band, then a sharpening pass on the edges. That enlargement never consults the full-resolution photograph. A strand thinner than one model pixel has nothing to be recovered from: it is interpolated, not reconstructed.
The second half is the background. The colour-based passes that would normally strip leftover background from between strands switch themselves off when the backdrop is busy — deliberately, because a single average colour is meaningless on a patterned background and keying against one damages real subject edges. So on a hedge, a bookshelf or a street you get the raw model edge plus one gentle colour blend, and none of the halo removal that makes a studio cutout look clean.
Hair preservation, despite the name, does not add hair. It keeps soft alpha soft: it only touches pixels that are already partly transparent, that sit on a real gradient in the photo, and that are close to a genuine mask edge. It cannot invent a strand the mask never had.
The passes responsible
- Mask enlargement (upscaleMask)
- Bilinear for the body, bicubic for pixels between 0.05 and 0.95 alpha, then an unsharp pass on the edge band. The source photo is not used as a guide, so detail below the 512px model grid cannot come back.
- Spill removal (smartEdgePass)
- Samples the background colour from fully transparent pixels and returns the mask untouched when that colour’s standard deviation exceeds 45 — the definition of a busy background.
- Uniform-background kill
- Only runs when the sampled corners are near-white (every channel at or above 210) or light and uniform (brightest channel at or above 175, spread across channels no more than 30) and low-variance. A garden or a living room fails all three tests, and the pass does nothing at all.
- Colour-evidence blend (guided filter)
- Needs both confident foreground (above 0.85) and confident background (below 0.15) samples inside a 17-pixel-wide window before it will move a pixel. In a thicket of strands it often has one or neither, and skips.
- Hair preservation
- Acts only on alpha between 0.35 and 0.95, where the image gradient is strong, and only within about 4 pixels of a real mask edge. It nudges those pixels at most 35% toward half-transparent so the edge stays soft.
What to do instead
Use Best Quality, not Fast
The two tiers are different models and the cleanup after them is tuned differently: Fast pulls edge pixels toward fully-on or fully-off harder than Best does, because its raw edges are softer. On hair that pull is exactly what you do not want.
Finish in the editor with the Soft edges preset
Edge Refinement ships a Soft edges preset for hair, fur and feathers — a light feather and smooth with a much gentler decontamination strength, and soft-edge preservation left on. The Hard edges preset does the opposite and will eat wisps.
Separate the subject from the backdrop when you shoot
Distance, a plainer wall, or a light behind the subject all raise the contrast at the strand level. This is the change that moves the mask itself rather than the cleanup afterwards.
Composite onto a background of similar tone
A soft, slightly imperfect hair edge is invisible against a background close to the original and obvious against its opposite. Choosing the destination background is a legitimate fix, not a cheat.
What will not help
Enlarging the photo before removal
The model resizes to its own input square either way, so the mask carries exactly the same detail — you have only spread it over more pixels. Upscaling after the cutout is a different and perfectly reasonable thing to do.
Running the same image again and hoping
The attempt order is fixed: Best falls back to Fast, Fast falls back to the compatibility model, and a retry re-runs the same model rather than rolling a different one. Change the setting or change the input.
Still true after all of the above: Even with every one of these, a strand that occupied less than a model pixel was never in the mask. What you can win back is the halo and the hard clump — not the individual hairs.