Tool to convert RGB values to the HSI colorspace

Committer:
frankvnk
Date:
Thu Apr 16 15:44:58 2015 +0000
Revision:
0:168f892cb7cb
initial release

Who changed what in which revision?

UserRevisionLine numberNew 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