rgb_to_hsv.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "rgb_to_hsv.h"
  2. template <typename R,typename H>
  3. void igl::rgb_to_hsv(const R * rgb, H * hsv)
  4. {
  5. // http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_%28C%29
  6. R rgb_max = 0.0;
  7. R rgb_min = 1.0;
  8. rgb_max = (rgb[0]>rgb_max?rgb[0]:rgb_max);
  9. rgb_max = (rgb[1]>rgb_max?rgb[1]:rgb_max);
  10. rgb_max = (rgb[2]>rgb_max?rgb[2]:rgb_max);
  11. rgb_min = (rgb[0]<rgb_min?rgb[0]:rgb_min);
  12. rgb_min = (rgb[1]<rgb_min?rgb[1]:rgb_min);
  13. rgb_min = (rgb[2]<rgb_min?rgb[2]:rgb_min);
  14. //hsv[2] = rgb_max;
  15. hsv[2] = rgb_max;
  16. if(hsv[2] == 0)
  17. {
  18. hsv[0]=hsv[1]=0;
  19. return;
  20. }
  21. // normalize
  22. R rgb_n[3];
  23. rgb_n[0] = rgb[0]/hsv[2];
  24. rgb_n[1] = rgb[1]/hsv[2];
  25. rgb_n[2] = rgb[2]/hsv[2];
  26. // Recomput max min?
  27. rgb_max = 0;
  28. rgb_max = (rgb_n[0]>rgb_max?rgb_n[0]:rgb_max);
  29. rgb_max = (rgb_n[1]>rgb_max?rgb_n[1]:rgb_max);
  30. rgb_max = (rgb_n[2]>rgb_max?rgb_n[2]:rgb_max);
  31. rgb_min = 1;
  32. rgb_min = (rgb_n[0]<rgb_min?rgb_n[0]:rgb_min);
  33. rgb_min = (rgb_n[1]<rgb_min?rgb_n[1]:rgb_min);
  34. rgb_min = (rgb_n[2]<rgb_min?rgb_n[2]:rgb_min);
  35. hsv[1] = rgb_max - rgb_min;
  36. if(hsv[1] == 0)
  37. {
  38. hsv[0] = 0;
  39. return;
  40. }
  41. rgb_n[0] = (rgb_n[0] - rgb_min)/(rgb_max - rgb_min);
  42. rgb_n[1] = (rgb_n[1] - rgb_min)/(rgb_max - rgb_min);
  43. rgb_n[2] = (rgb_n[2] - rgb_min)/(rgb_max - rgb_min);
  44. // Recomput max min?
  45. rgb_max = 0;
  46. rgb_max = (rgb_n[0]>rgb_max?rgb_n[0]:rgb_max);
  47. rgb_max = (rgb_n[1]>rgb_max?rgb_n[1]:rgb_max);
  48. rgb_max = (rgb_n[2]>rgb_max?rgb_n[2]:rgb_max);
  49. rgb_min = 1;
  50. rgb_min = (rgb_n[0]<rgb_min?rgb_n[0]:rgb_min);
  51. rgb_min = (rgb_n[1]<rgb_min?rgb_n[1]:rgb_min);
  52. rgb_min = (rgb_n[2]<rgb_min?rgb_n[2]:rgb_min);
  53. if (rgb_max == rgb_n[0]) {
  54. hsv[0] = 0.0 + 60.0*(rgb_n[1] - rgb_n[2]);
  55. if (hsv[0] < 0.0) {
  56. hsv[0] += 360.0;
  57. }
  58. } else if (rgb_max == rgb_n[1]) {
  59. hsv[0] = 120.0 + 60.0*(rgb_n[2] - rgb_n[0]);
  60. } else /* rgb_max == rgb_n[2] */ {
  61. hsv[0] = 240.0 + 60.0*(rgb_n[0] - rgb_n[1]);
  62. }
  63. }
  64. #ifndef IGL_HEADER_ONLY
  65. // Explicit instanciation
  66. template void igl::rgb_to_hsv<float, double>(float const*, double*);
  67. template void igl::rgb_to_hsv<double, double>(double const*, double*);
  68. #endif