Skip to content

Dull skin and radiance

Dull skin measures the absence of natural luminosity. The score is derived from the shine analysis.

components:
- dull_skin
- radiance
- radiance_adjusted
request:
query: "components=dull_skin,radiance,radiance_adjusted"
response_path:
- "results[].description == \"dull_skin\""
- "results[].description == \"radiance\""
- "results[].description == \"radiance_adjusted\""
value_range: [0, 1] # dull_skin can be -1; radiance / radiance_adjusted can be null when unavailable
warnings: [] # these metrics emit no metric-specific codes
  • dull_skin — diagnostic UIs (“here’s what’s reducing your glow”).
  • radiance — improvement-tracking UIs (“your radiance is up”).
  • radiance_adjusted — cross-user analytics or cohort studies.
const dull = response.results.find((r) => r.description === "dull_skin");
const radiant = response.results.find((r) => r.description === "radiance");

These metrics don’t have a visualization channel — they’re whole-face scores. Surface as a single dial or score, not a heatmap.

When the underlying shine analysis is unavailable, these fall back to a sentinel instead of a real score: dull_skin returns -1, while radiance and radiance_adjusted return null. Guard for both (e.g. dull.value >= 0, radiant.value != null) and show an “n/a” treatment rather than a bogus dial.

  • Foundation and finishing products change how much light the skin surface returns, so they move these scores — the reading reflects the product on the skin as much as the skin itself. Ask users to capture bare-faced for trend tracking.

These metrics emit no metric-specific local_warnings[] codes; they inherit the global image-quality codes.

  • How metrics connect — dull_skin is derived from shine; radiance combines smoothness + shine.
  • Visualization data — Cat A (no spatial output). Same category as skin_firmness. The metric is a derived/inverted whole-face score; no per-feature data, no AOIs, no mask shapes. UI should be a single dial / number, never a face overlay.