Mads Lee Jensen
Mads Lee Jensen

Reputation: 4658

Calculating how "colorful" a color is

I like to create a ratio between 0-1 of how "colorful" a color is, by colorful i mean:

i tried by converting the color to HSV colorspace and calculating the ratio as:

ratio = (color.value / 100) * (color.saturation / 100)

This works somewhat, but it feels like the curve is wrong, for example a

HSV(hue=0, saturation=80, value=80)

enter image description here

only gives a ratio of 0.64 but looks very close to the fully saturated / lighted color.

Maybe i need to somehow create a "ease-out" on the values? i thought about taking human perception of colors into account aswell (using LAB or YUV colorspaces) but i dont think that is needed here, but i might be wrong.

Upvotes: 3

Views: 267

Answers (2)

Timothy Shields
Timothy Shields

Reputation: 79531

The definition of saturation from HSV is not what you want, because it does not compensate for the lightness of the color.

From the Wikipedia article on Colorfulness:

[Perceived saturation] is the proportion of pure chromatic color in the total color sensation.

Formula for perceived saturation

where Sab is the saturation, L* the lightness and C*ab is the chroma of the color.

This definition uses the L* and C*ab components of the CIELAB colorspace. My guess is that for your application you could use Lab colorspace instead. Then your code would look like this:

function perceived_saturation(L, a, b)
    return 100 * sqrt(a*a + b*b) / sqrt(L*L + a*a + b*b)

For your example color RGB = (204, 41, 41), this returns a perceived saturation of about 86%, when converting the color via the path RGB → sRGB → Lab.

Upvotes: 5

Mark Ransom
Mark Ransom

Reputation: 308412

As a simple approximation, you could use max(r,g,b)/255 - min(r,g,b)/255. It has the properties you seek, where anything on the gray spectrum between black and white has a colorfulness of 0, and only fully lit colors will have a colorfulness of 1. A fully saturated but dark color will be in between, e.g. (128, 0, 0) will have a colorfulness of ~0.5.

Upvotes: 2

Related Questions