00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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;
00136 goto ass_end;
00137 } else {
00138 switch (maxVal)
00139 {
00140 case 0: h = 0 + ( g - b ) / delta; break;
00141 case 1: h = 2 + ( b - r ) / delta; break;
00142 case 2: h = 4 + ( r - g ) / delta; break;
00143 default: h = 0 ; break ;
00144 }
00145 }
00146
00147 h *= 60;
00148 if (h < 0) h += 360;
00149
00150 ass_end:
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) {
00173 rgb[0] = rgb[1] = rgb[2] = (int) v * 255;
00174 }
00175 hTemp = h / 60.0f;
00176 i = (int) floor(hTemp);
00177 f = hTemp - i;
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 ;
00190 }
00191
00192 rgb[0] = int (r * 255);
00193 rgb[1] = int (g * 255);
00194 rgb[2] = int (b * 255);
00195
00196 }
00197