View Raw SPL
rgb2hsv(r, g, b)
{
local mx, mn, df, h, s, v, rc, gc, bc;
local mxn, mxr, mxg, mxb, nr = -1;
if (argc == 1)
{
if (length(r) == 3)
{
nr = 3;
r = transpose(r);
}
if (numcols(r) == 3)
{
g = col(r, 2);
b = col(r, 3);
r = col(r, 1);
}
else
{
/* assume image */
(r, g, b) = getrgb(r);
}
}
else if (argc != 3)
{
error(sprintf("%s - 1 or 3 input arguments required", __FUNC__));
}
if (max(r) > 1 || max(g) > 1 || max(b) > 1)
{
r /= 255;
g /= 255;
b /= 255;
}
mx = max(r, max(g, b));
mn = min(r, min(g, b));
df = (mx - mn);
v = mx;
/* avoid nan */
df[find(df == 0)] = inf;
rc = (mx - r) / df;
gc = (mx - g) / df;
bc = (mx - b) / df;
mxn = (mx != mn);
mxr = (mx != r);
mxg = (mx != g);
mxb = (mx != b);
h = mxn * 0;
h += mxn * not(mxr) * (bc - gc);
h += mxn * mxr * not(mxg) * (2 + rc - bc);
h += mxn * mxr * mxg * not(mxb) * (4 + gc - rc);
h = (h / 6.0) % 1;
/* avoid nan */
df[find(isinf(df))] = 0;
mx[find(mx == 0)] = inf;
s = mxn * df / mx;
if (outargc <= 1)
{
/* cast to series */
h = {h};
s = {s};
v = {v};
}
/* label */
if (nr == 3)
{
setvunits(h, "HSV");
}
else
{
if (isarray(h)) setvunits(h, "Hue");
if (isarray(s)) setvunits(s, "Saturation");
if (isarray(v)) setvunits(v, "Lightness");
}
if (outargc > 1)
{
return(h, s, v);
}
else if (nr == 3)
{
return({h, s, v});
}
else
{
return(ravel(h, s, v));
}
}