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));
        }
}