matlab octave rgb2hsv compatibility

rgb2hsv2.m

function hsval = rgb2hsv2(rgb)

if (nargin != 1)
print_usage ();
endif

## If we have an image convert it into a color map.
if (ismatrix (rgb) && ndims (rgb) == 3)
is_image = true;
Sz = size (rgb);
rgb = [rgb(:,:,1)(:), rgb(:,:,2)(:), rgb(:,:,3)(:)];
## Convert to a double image.
  if (isinteger(rgb))
    C = class (rgb);%uint8
    low = double (intmin (C));
    high = double (intmax (C));
    rgb = (double (rgb) - low) / (high - low);
  end
else
is_image = false;
end

if ( (!ismatrix(rgb)) || (columns(rgb)!=3) )
error ("rgb2hsv: argument must be a matrix of size n x 3");
endif

## get the max and min
s = min (rgb')';
v = max (rgb')';

 ## set hue to zero for undefined values (gray has no hue)
h = zeros (size (v));
notgray = (s != v);

## blue hue
idx = (v == rgb(:,3) & notgray);
if (any (idx))
h(idx) = 2/3 + 1/6 * (rgb(idx,1) - rgb(idx,2)) ./ (v(idx) - s(idx));
endif

## green hue
idx = (v == rgb(:,2) & notgray);
if (any (idx))
h(idx) = 1/3 + 1/6 * (rgb(idx,3) - rgb(idx,1)) ./ (v(idx) - s(idx));
endif

## red hue
idx = (v == rgb(:,1) & notgray);
if (any (idx))
h(idx) = 1/6 * (rgb(idx,2) - rgb(idx,3)) ./ (v(idx) - s(idx));
endif

## correct for negative red
idx = (h < 0);
h(idx) = 1+h(idx);

## set the saturation
s(! notgray) = 0;
s(notgray) = 1 - s(notgray) ./ v(notgray);

hsval = [h, s, v];

## If input was an image, convert it back into one.
if (is_image)
hsval = reshape (hsval, Sz);
endif

endfunction 

overcome "rgb2hsv: argument must be a matrix of size n x 3".