diff --git a/src/ipa/libipa/histogram.cpp b/src/ipa/libipa/histogram.cpp
index c1aac59b..2a4095f4 100644
--- a/src/ipa/libipa/histogram.cpp
+++ b/src/ipa/libipa/histogram.cpp
@@ -40,13 +40,15 @@ namespace ipa {
 /**
  * \brief Create a cumulative histogram
  * \param[in] data A pre-sorted histogram to be passed
+ * \param[in] transform The transformation function to apply to every bin
  */
-Histogram::Histogram(Span<const uint32_t> data)
+Histogram::Histogram(Span<const uint32_t> data,
+		     std::function<uint32_t(const uint32_t)> transform)
 {
 	cumulative_.reserve(data.size());
 	cumulative_.push_back(0);
 	for (const uint32_t &value : data)
-		cumulative_.push_back(cumulative_.back() + value);
+		cumulative_.push_back(cumulative_.back() + transform(value));
 }
 
 /**
diff --git a/src/ipa/libipa/histogram.h b/src/ipa/libipa/histogram.h
index 54bb2a19..89a6b550 100644
--- a/src/ipa/libipa/histogram.h
+++ b/src/ipa/libipa/histogram.h
@@ -8,9 +8,9 @@
 #pragma once
 
 #include <assert.h>
+#include <functional>
 #include <limits.h>
 #include <stdint.h>
-
 #include <vector>
 
 #include <libcamera/base/span.h>
@@ -23,7 +23,9 @@ class Histogram
 {
 public:
 	Histogram() { cumulative_.push_back(0); }
-	Histogram(Span<const uint32_t> data);
+	Histogram(Span<const uint32_t> data,
+		  std::function<uint32_t(const uint32_t)> transform =
+		  	[](uint32_t x) { return x; });
 	size_t bins() const { return cumulative_.size() - 1; }
 	uint64_t total() const { return cumulative_[cumulative_.size() - 1]; }
 	uint64_t cumulativeFrequency(double bin) const;
