HSI.cpp
上传用户:mjs2008
上传日期:2021-05-16
资源大小:5089k
文件大小:2k
源码类别:

生物技术

开发平台:

Visual C++

  1. /**$6
  2.  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3.  *
  4.  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5.  */
  6. #include "stdafx.h"
  7. #include "HSI.h"
  8. #include <math.h>
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define DEGREES_PER_RADIAN (180.0 / 3.14159265358979)
  15. // define UNDEFINED_HUE -1.000
  16. #define UNDEFINED_HUE 0.000
  17. #define ZERO_SATURATION 0.0
  18. /**
  19.  =======================================================================================================================
  20.  *
  21.  =======================================================================================================================
  22.  */
  23. int RgbToHsi(RGB *RgbPtr, HSI *HsiPtr)
  24. {
  25. double R, G, B, Sum, Quotient;
  26. double Radians, Angle, MinValue, MaxValue, TempDouble1, TempDouble2;
  27. R = ((double) RgbPtr->r) / 255.0;
  28. G = ((double) RgbPtr->g) / 255.0;
  29. B = ((double) RgbPtr->b) / 255.0;
  30. Sum = R + G + B;
  31. HsiPtr->Intensity = Sum / 3.0;
  32. MinValue = (R < G) ? R : G;
  33. MinValue = (B < MinValue) ? B : MinValue;
  34. MaxValue = (R > G) ? R : G;
  35. MaxValue = (B > MaxValue) ? B : MaxValue;
  36. if(HsiPtr->Intensity < 0.00001)
  37. HsiPtr->Saturation = ZERO_SATURATION;
  38. else
  39. HsiPtr->Saturation = 1.0 - (3.0 * MinValue) / Sum;
  40. if(MinValue == MaxValue)
  41. {
  42. HsiPtr->Hue = UNDEFINED_HUE;
  43. HsiPtr->Saturation = ZERO_SATURATION;
  44. return 0;
  45. }
  46. TempDouble1 = (((R - G) + (R - B)) / 2.0);
  47. TempDouble2 = (R - G) * (R - G) + (R - B) * (G - B);
  48. Quotient = (TempDouble1 / sqrt(TempDouble2));
  49. if(Quotient > 0.99999999999999999)
  50. Radians = 0.0;
  51. else if(Quotient < -0.99999999999999999)
  52. Radians = 3.1415926535;
  53. else
  54. Radians = acos(TempDouble1 / sqrt(TempDouble2));
  55. Angle = Radians * DEGREES_PER_RADIAN;
  56. if(B > G)
  57. HsiPtr->Hue = 360.0 - Angle;
  58. else
  59. HsiPtr->Hue = Angle;
  60. return 0;
  61. }