sub rgb_to_hsv {
my ($r, $g, $b) = shift @_;
my $max = 0;
my $min = 255;
for ($r, $g, $b) { $max = $_ if $max < $_ }
for ($r, $g, $b) { $min = $_ if $min > $_ }
my ($h, $s, $v);
#H Calculations to find H
# You have greyscale if RGB are the same. "If you've got grey, the
# question "is it red, or blue, or green, or yellow" is pointless"
if ($max == $min) {
$h = undef;
}
#Refer to http://en.wikipedia.org/wiki/HSV_color_space for details on the
#remaining steps
elsif (($max == $r) && ($g >= $b)) {
$h = 60 * (($g-$b)/($max-$min)) + 0;
}
elsif (($max== $r) && ($g < $b)) {
$h = 60 * (($g-$b)/($max-$min)) + 360;
}
elsif ($max == $g) {
$h = 60 * (($b-$r)/($max-$min)) + 120;
}
elsif ($max == $b) {
$h = 60 * (($r-$g)/($max-$min)) + 240;
}
#S Calculations to find S
if ($max == 0) { #No saturation if the colour is Black
$s = 0;
}
else {
$s = 1 - ($min / $max) #Finds Saturation using a formula :P
}
#V Calculations to find V
$v = $max; #V is the highest of the RGB values.
return ($h, $s, $v);
}