Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

ImageHSV.cpp

Go to the documentation of this file.
00001 /**************************************************************************
00008  *
00009  * Source code for Real Time Image Library (libRTImage)
00010  *
00011  * Leeds Vision Group give permission for this code to be copied, modified
00012  * and distributed within the University of Leeds subject to the following
00013  * conditions:-
00014  *
00015  * - The code is not to be used for commercial gain.
00016  * - The code and use thereof will be attributed to the author where
00017  *   appropriate (inluding demonstrations which rely on it's use).
00018  * - All modified, distributions of the source files will retain this header.
00019  *
00020  ****************************************************************************/
00021 
00022 #include <math.h>
00023 #include <ImageHSV.h>
00024 
00025 ImageHSV::ImageHSV(ImageRGB& img) : ImageBase(img), ImageRGB(img) 
00029 {
00030     rgb2hsv() ; 
00031 }
00032 
00033 ImageHSV::ImageHSV(ImageRGB& img,
00034                    unsigned int min_x,
00035                    unsigned int min_y,
00036                    unsigned int max_x,
00037                    unsigned int max_y) : 
00038                                       ImageRGB(img, min_x, min_y, max_x,max_y),
00039                                       ImageBase(max_x-min_x+1, max_y-min_y+1)
00048 {
00049     rgb2hsv() ; 
00050 }
00051 
00052 ImageHSV::ImageHSV(ImageHSV& img,
00053                    unsigned int min_x,
00054                    unsigned int min_y,
00055                    unsigned int max_x,
00056                    unsigned int max_y) : 
00057                                       ImageRGB(img, min_x, min_y, max_x,max_y),
00058                                       ImageBase(max_x-min_x+1, max_y-min_y+1)
00067 {
00068 }
00069 
00070 
00071 
00072 void ImageHSV::rgb2hsv()
00076 {
00077     unsigned int cnt ;
00078     PixelHSV     hsv ;
00079     PixelRGB     *rgb ;
00080 
00081     rgb = data ;
00082     for(cnt=0 ; cnt<width*height ; cnt++, rgb++){
00083         convPixel_RGBtoHSV(*rgb, hsv) ;
00084         *rgb = hsv ;
00085     }
00086 }
00087 
00088 void ImageHSV::hsv2rgb() 
00092 {
00093     unsigned int cnt ;
00094     PixelHSV     *hsv ;
00095     PixelRGB     rgb ;
00096 
00097     hsv = data ;
00098     for(cnt=0 ; cnt<width*height ; cnt++, hsv++){
00099         convPixel_HSVtoRGB(*hsv, rgb) ;
00100         *hsv = rgb ;
00101     }
00102 }
00103 
00104 void ImageHSV::convPixel_RGBtoHSV (PixelRGB& rgb, PixelHSV& hsv)
00108 {
00109     float r = rgb[RED  ] / 255.0;
00110     float g = rgb[GREEN] / 255.0;
00111     float b = rgb[BLUE ] / 255.0;
00112 
00113     float h, s, v;
00114 
00115     float mn = r, mx = r;
00116     int maxVal = 0;
00117 
00118     if (g > mx) { mx = g; maxVal = 1; }
00119     if (b > mx) { mx = b; maxVal = 2; }
00120     if (g < mn) mn = g;
00121     if (b < mn) mn = b;
00122 
00123     float  delta = mx - mn;
00124 
00125     v = mx;
00126     if (mx != 0)
00127         s = delta / mx;
00128     else {
00129         s = 0;
00130         h = 0;
00131         goto ass_end;
00132     }
00133 
00134     if (s == 0.0f) {
00135         h = 0; // Arbritrary
00136         goto ass_end;
00137     } else {
00138         switch (maxVal)
00139         {
00140             case 0: h = 0 + ( g - b ) / delta; break;     // yel  < h < mag
00141             case 1: h = 2 + ( b - r ) / delta; break;     // cyan < h < yel
00142             case 2: h = 4 + ( r - g ) / delta; break;     // mag  < h < cyan
00143             default: h = 0 ; break ; // Should never occur
00144         }
00145     }
00146 
00147     h *= 60;
00148     if (h < 0) h += 360;
00149 
00150 ass_end:    // the assignments at the end of the function ;-)
00151 
00152     hsv[0] = int (h);
00153     hsv[1] = int (s * 255);
00154     hsv[2] = int (v * 255);
00155 
00156 }
00157 
00158 void ImageHSV::convPixel_HSVtoRGB (PixelHSV& hsv, PixelRGB& rgb)
00162 {
00163     int i;
00164     float f, p, q, t, hTemp;
00165 
00166     float h = hsv[0];
00167     float s = hsv[1] / 255.0;
00168     float v = hsv[2] / 255.0;
00169 
00170     float r, g, b;
00171 
00172     if (s == 0.0 || h == -1.0) { // s==0? Totally unsaturated = grey
00173         rgb[0] = rgb[1] = rgb[2] = (int) v * 255;
00174     }
00175     hTemp = h / 60.0f;
00176     i = (int) floor(hTemp);                 // which sector
00177     f = hTemp - i;                      // how far through sector
00178     p = v * ( 1 - s );
00179     q = v * ( 1 - s * f );
00180     t = v * ( 1 - s * ( 1 - f ) );
00181 
00182     switch (i) {
00183         case 0: r = v; g = t; b = p; break;
00184         case 1: r = q; g = v; b = p; break;
00185         case 2: r = p; g = v; b = t; break;
00186         case 3: r = p; g = q; b = v; break;
00187         case 4: r = t; g = p; b = v; break;
00188         case 5: r = v; g = p; b = q; break;
00189         default: r=0 ; g=0 ; b=0 ; break ; // Should never occur
00190     }
00191 
00192     rgb[0] = int (r * 255);
00193     rgb[1] = int (g * 255);
00194     rgb[2] = int (b * 255);
00195 
00196 }
00197 

Generated at Fri Aug 13 17:29:21 2004 for libRTImage by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001