Skip to content

Redness

Redness metric responds to variations of the amount of red color (caused by e.g. local inflammation) in the skin disregarding the base skin tone.

component: redness
request:
query: "components=redness"
response_path: "results[].description == \"redness\""
value_range: [0, 1] # normalized severity
also_request:
- redness_visualization # polygon-area features, 3 intensity levels by default
- redness_absolute # tone-adjusted variant for cross-user comparison
warnings: [] # redness emits no metric-specific codes

Request the component:

?components=redness

The corresponding entry in results[]:

{
"description": "redness",
"value": 0.18, // 0..1, normalized severity
"message": "Ok",
"local_warnings": [],
"measurement_locations": [
{ "description": "left cheek", "value": 0.21, "AOI_x_o": 412, "AOI_y_o": 580, "AOI_radius_o": 90, "ut_zone": "u-zone" },
{ "description": "right cheek", "value": 0.19, "..." },
{ "description": "forehead", "value": 0.11, "..." }
// …11 regions in total (cheeks, forehead, nose, chin, around-mouth, around/under-eye).
// A region returns value -1 when its mask is unavailable.
// The overall score is the top-level `value` — there is no "Global" region entry.
],
"sum_measures": []
}

If you also request redness_visualization, you get a visualization_data[] array of polygon-area features with 3 intensity levels by default (per-feature intensity is a category integer 1..3, not a continuous score). Higher-intensity polygons sit inside lower-intensity ones — render with low opacity and the layering produces a heatmap-like gradient. See Rendering recipes → Polygon areas.

For a tone-adjusted variant intended for comparison across users, request redness_absolute instead.

Reference imagery for this metric is not yet published.

For a numeric UI:

const redness = response.results.find((r) => r.description === "redness");
const score = Math.round(redness.value * 100); // 0..100

For a regional breakdown:

const regions = redness.measurement_locations
.filter((m) => m.value >= 0) // skip unavailable regions (value -1)
.sort((a, b) => b.value - a.value);

For a heatmap-style overlay:

  1. Request redness_visualization alongside redness.
  2. Sort visualization_data[] ascending by intensity (categorical 1..3).
  3. For each feature, fill the polygon defined by its x[] / y[] arrays with a warm color, opacity ≈ 0.45.
  4. Higher-intensity polygons naturally render on top, producing a layered gradient.
  5. The polygon colours here are ones you choose, so colour balance doesn’t apply to them. Only if you also overlay a CV-measured colour (e.g. a skin/foundation swatch) do you re-bias it with inverse_color_balance_rb so it matches the original photo.

Paste-ready code: Rendering recipes → Polygon areas.

  • Heavy makeup can mask redness, so the score may understate true erythema when coverage products are worn. The API has no makeup-coverage signal to gate on, so surface a “based on visible skin” disclaimer rather than trying to auto-hide.

The redness metric emits no metric-specific local_warnings[] codes; it inherits the global image-quality codes. When a region’s mask can’t be generated, that region simply returns value: -1 (no status code). See Error handling.