Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest formula to get Hue from RGB

Tags:

colors

rgb

If you are given red, green, and blue values that range from 0-255, what would be the fastest computation to get just the hue value? This formula will be used on every pixel of a 640x480 image at 30fps (9.2 million times a second) so every little bit of speed optimization helps.

I've seen other formulas but I'm not happy with how many steps they involve. I'm looking for an actual formula, not a built in library function.

like image 957
user3161533 Avatar asked Apr 15 '14 16:04

user3161533


People also ask

How do you calculate chroma and hue?

Pelin Poçan The answer is chroma = square root of (a*²+b*²) and the hue = tan inverse (b*/a*) as mentioned by others. You can find out more details in the attached brochure. The conversion (if you know a* and b*) of C* and h° is performed as follows: C* = square root of (a*²+b*²);

How is hue angle calculated?

The hue angle formula is not just one, but many, depending on which quadrant your colour is located (see figure attached). When "a" has a negative value and "b" has a positive value, the colour is located in quadrant II, so the hue angle formula is 180 + tan-1 ( b* / a*).

Which method is used to convert RGB color to HSV?

HSV = rgb2hsv( RGB ) converts the red, green, and blue values of an RGB image to hue, saturation, and value (HSV) values of an HSV image. hsvmap = rgb2hsv( rgbmap ) converts an RGB colormap to an HSV colormap.


2 Answers

  1. Convert the RGB values to the range 0-1, this can be done by dividing the value by 255 for 8-bit color depth (r,g,b - are given values):

    R = r / 255 = 0.09 G = g / 255 = 0.38 B = b / 255 = 0.46 
  2. Find the minimum and maximum values of R, G and B.

  3. Depending on what RGB color channel is the max value. The three different formulas are:

    • If Red is max, then Hue = (G-B)/(max-min)
    • If Green is max, then Hue = 2.0 + (B-R)/(max-min)
    • If Blue is max, then Hue = 4.0 + (R-G)/(max-min)

The Hue value you get needs to be multiplied by 60 to convert it to degrees on the color circle. If Hue becomes negative you need to add 360 to, because a circle has 360 degrees.

Here is the full article.

like image 80
Umriyaev Avatar answered Oct 02 '22 13:10

Umriyaev


In addition to Umriyaev's answer:

If only the hue is needed, it is not required to divide the 0-255 ranged colours with 255.

The result of e.x. (green - blue) / (max - min) will be the same for any range (as long as the colours are in the same range of course).

Here is the java example to get the Hue:

public int getHue(int red, int green, int blue) {      float min = Math.min(Math.min(red, green), blue);     float max = Math.max(Math.max(red, green), blue);      if (min == max) {         return 0;     }      float hue = 0f;     if (max == red) {         hue = (green - blue) / (max - min);      } else if (max == green) {         hue = 2f + (blue - red) / (max - min);      } else {         hue = 4f + (red - green) / (max - min);     }      hue = hue * 60;     if (hue < 0) hue = hue + 360;      return Math.round(hue); } 

Edit: added check if min and max are the same, since the rest of the calculation is not needed in this case, and to avoid division by 0 (see comments)

Edit: fixed java error

like image 22
Zarokka Avatar answered Oct 02 '22 13:10

Zarokka