Tool to convert RGB values to the HSI colorspace
rgb2hsi.h@0:168f892cb7cb, 2015-04-16 (annotated)
- Committer:
- frankvnk
- Date:
- Thu Apr 16 15:44:58 2015 +0000
- Revision:
- 0:168f892cb7cb
initial release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frankvnk | 0:168f892cb7cb | 1 | /************************************************************************************************************** |
frankvnk | 0:168f892cb7cb | 2 | ***** ***** |
frankvnk | 0:168f892cb7cb | 3 | ***** Name: rgb2hsi.h ***** |
frankvnk | 0:168f892cb7cb | 4 | ***** Date: 12/04/2015 ***** |
frankvnk | 0:168f892cb7cb | 5 | ***** Auth: Frank Vannieuwkerke ***** |
frankvnk | 0:168f892cb7cb | 6 | ***** Func: convert RGB color space values to HSI ***** |
frankvnk | 0:168f892cb7cb | 7 | ***** ***** |
frankvnk | 0:168f892cb7cb | 8 | ***** Source : http://www.had2know.com/technology/hsi-rgb-color-converter-equations.html ***** |
frankvnk | 0:168f892cb7cb | 9 | ***** ***** |
frankvnk | 0:168f892cb7cb | 10 | **************************************************************************************************************/ |
frankvnk | 0:168f892cb7cb | 11 | |
frankvnk | 0:168f892cb7cb | 12 | #ifndef RGB2HSI_H |
frankvnk | 0:168f892cb7cb | 13 | #define RGB2HSI_H |
frankvnk | 0:168f892cb7cb | 14 | |
frankvnk | 0:168f892cb7cb | 15 | /** Convert RGB to HSI. |
frankvnk | 0:168f892cb7cb | 16 | * |
frankvnk | 0:168f892cb7cb | 17 | * @param rgb Input - Pointer to RGB array[3] (uint8_t 0..255).\n |
frankvnk | 0:168f892cb7cb | 18 | * rgb[0] = red, rgb[1] = green, rgb[2] = blue.\n |
frankvnk | 0:168f892cb7cb | 19 | * @param Hue Output - Pointer to Hue (float 0..360)\n |
frankvnk | 0:168f892cb7cb | 20 | * @param Saturation Output - Pointer to Saturation (float 0..1)\n |
frankvnk | 0:168f892cb7cb | 21 | * @param Intensity Output - Pointer to Intensity (float 0..1)\n |
frankvnk | 0:168f892cb7cb | 22 | * |
frankvnk | 0:168f892cb7cb | 23 | */ |
frankvnk | 0:168f892cb7cb | 24 | void rgb2hsi (uint8_t *rgb, float *Hue, float *Saturation, float *Intensity) |
frankvnk | 0:168f892cb7cb | 25 | { |
frankvnk | 0:168f892cb7cb | 26 | float red = (float)rgb[0]; |
frankvnk | 0:168f892cb7cb | 27 | float green = (float)rgb[1]; |
frankvnk | 0:168f892cb7cb | 28 | float blue = (float)rgb[2]; |
frankvnk | 0:168f892cb7cb | 29 | *Intensity = (red + green + blue)/3; |
frankvnk | 0:168f892cb7cb | 30 | if(*Intensity == 0) { |
frankvnk | 0:168f892cb7cb | 31 | *Saturation = 0; |
frankvnk | 0:168f892cb7cb | 32 | } else { |
frankvnk | 0:168f892cb7cb | 33 | *Saturation = 1 - min(red,min(green,blue))/(*Intensity); |
frankvnk | 0:168f892cb7cb | 34 | } |
frankvnk | 0:168f892cb7cb | 35 | |
frankvnk | 0:168f892cb7cb | 36 | if((red == green) && (red == blue)) { |
frankvnk | 0:168f892cb7cb | 37 | *Hue = 0; |
frankvnk | 0:168f892cb7cb | 38 | } else { |
frankvnk | 0:168f892cb7cb | 39 | *Hue = acos((red - (green/2) - (blue/2)) / sqrt((red*red) + (green*green) + (blue*blue) - (red*green) - (red*blue) - (green*blue))); |
frankvnk | 0:168f892cb7cb | 40 | *Hue = *Hue * 180.0f / 3.14159265f; |
frankvnk | 0:168f892cb7cb | 41 | if(blue > green) |
frankvnk | 0:168f892cb7cb | 42 | *Hue = 360.0f - (*Hue); |
frankvnk | 0:168f892cb7cb | 43 | } |
frankvnk | 0:168f892cb7cb | 44 | *Hue = floor((*Hue)+0.5); |
frankvnk | 0:168f892cb7cb | 45 | *Intensity = floor((*Intensity)+0.5f)/255; |
frankvnk | 0:168f892cb7cb | 46 | *Saturation = floor(((*Saturation)*10000)+0.5f)/10000; |
frankvnk | 0:168f892cb7cb | 47 | } |
frankvnk | 0:168f892cb7cb | 48 | |
frankvnk | 0:168f892cb7cb | 49 | #endif |