Histogram.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. namespace ImageProcessingAtom
  10. {
  11. template <size_t BIN_COUNT>
  12. class Histogram
  13. {
  14. public:
  15. typedef AZ::u64 Bins[BIN_COUNT];
  16. public:
  17. Histogram()
  18. {
  19. }
  20. static void clearBins(Bins& bins)
  21. {
  22. memset(&bins, 0, sizeof(bins));
  23. }
  24. void set(const Bins& bins)
  25. {
  26. m_bins[0] = bins[0];
  27. m_binsCumulative[0] = bins[0];
  28. double sum = 0.0f;
  29. for (size_t i = 1; i < BIN_COUNT; ++i)
  30. {
  31. m_bins[i] = bins[i];
  32. m_binsCumulative[i] = m_binsCumulative[i - 1] + bins[i];
  33. sum += i * double(bins[i]);
  34. }
  35. const AZ::u64 totalCount = getTotalSampleCount();
  36. m_meanBin = (totalCount <= 0) ? 0.0f : float(sum / totalCount);
  37. }
  38. AZ::u64 getTotalSampleCount() const
  39. {
  40. return m_binsCumulative[BIN_COUNT - 1];
  41. }
  42. float getPercentage(size_t minBin, size_t maxBin) const
  43. {
  44. const AZ::u64 totalCount = getTotalSampleCount();
  45. if ((totalCount <= 0) || (minBin > maxBin) || (maxBin < 0) || (minBin >= BIN_COUNT))
  46. {
  47. return 0.0f;
  48. }
  49. minBin = AZ::GetMax(minBin, size_t(0));
  50. maxBin = AZ::GetMin(maxBin, BIN_COUNT - 1);
  51. const AZ::u64 count = m_binsCumulative[maxBin] - ((minBin <= 0) ? 0 : m_binsCumulative[minBin - 1]);
  52. return float((double(count) * 100.0) / double(totalCount));
  53. }
  54. float getMeanBin() const
  55. {
  56. return m_meanBin;
  57. }
  58. private:
  59. Bins m_bins;
  60. Bins m_binsCumulative;
  61. float m_meanBin;
  62. };
  63. bool ComputeLuminanceHistogram(IImageObjectPtr imageObject, Histogram<256>& histogram);
  64. }