www.pudn.com > partsumhist.rar > HSI.cpp
/**$6 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ #include "stdafx.h" #include "HSI.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define DEGREES_PER_RADIAN (180.0 / 3.14159265358979) // define UNDEFINED_HUE -1.000 #define UNDEFINED_HUE 0.000 #define ZERO_SATURATION 0.0 /** ======================================================================================================================= * ======================================================================================================================= */ int RgbToHsi(RGB *RgbPtr, HSI *HsiPtr) { double R, G, B, Sum, Quotient; double Radians, Angle, MinValue, MaxValue, TempDouble1, TempDouble2; R = ((double) RgbPtr->r) / 255.0; G = ((double) RgbPtr->g) / 255.0; B = ((double) RgbPtr->b) / 255.0; Sum = R + G + B; HsiPtr->Intensity = Sum / 3.0; MinValue = (R < G) ? R : G; MinValue = (B < MinValue) ? B : MinValue; MaxValue = (R > G) ? R : G; MaxValue = (B > MaxValue) ? B : MaxValue; if(HsiPtr->Intensity < 0.00001) HsiPtr->Saturation = ZERO_SATURATION; else HsiPtr->Saturation = 1.0 - (3.0 * MinValue) / Sum; if(MinValue == MaxValue) { HsiPtr->Hue = UNDEFINED_HUE; HsiPtr->Saturation = ZERO_SATURATION; return 0; } TempDouble1 = (((R - G) + (R - B)) / 2.0); TempDouble2 = (R - G) * (R - G) + (R - B) * (G - B); Quotient = (TempDouble1 / sqrt(TempDouble2)); if(Quotient > 0.99999999999999999) Radians = 0.0; else if(Quotient < -0.99999999999999999) Radians = 3.1415926535; else Radians = acos(TempDouble1 / sqrt(TempDouble2)); Angle = Radians * DEGREES_PER_RADIAN; if(B > G) HsiPtr->Hue = 360.0 - Angle; else HsiPtr->Hue = Angle; return 0; }