summaryrefslogtreecommitdiff
path: root/src/ipa/libipa/awb_bayes.h
diff options
context:
space:
mode:
authorStefan Klug <stefan.klug@ideasonboard.com>2025-01-23 12:40:59 +0100
committerStefan Klug <stefan.klug@ideasonboard.com>2025-02-21 17:51:09 +0100
commitf45eb6bd9d7d68d277b0575a627133cc40960af9 (patch)
tree4aa76c2fa43a4268c4f387580247fd8c19e7a651 /src/ipa/libipa/awb_bayes.h
parent60d60c13672b81f2a57894467a569c6ba98ae895 (diff)
libipa: Add bayesian AWB algorithm
The bayesian AWB algorithm is an AWB algorithm that takes prior probabilities for a given light source dependent on the current lux level into account. The biggest improvement compared to the grey world model comes from the search of the ideal white point on the CT curve. The algorithm walks the CT curve to minimize the colour error for a given statistics. After the minimium is found it additionally tries to search the area around that spot and also off the curve. So even without defined prior probabilities this algorithm provides much better results than the grey world algorithm. The logic for this code was taken from the RaspberryPi implementation. The logic was only minimally adjusted for usage with the rkisp1 and a few things were left out (see doxygen doc for the AwbBayes class). The code is refactored to better fit the libcamera code style and to make use of the syntactic sugar provided by the Interpolator and Vector classes. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Diffstat (limited to 'src/ipa/libipa/awb_bayes.h')
-rw-r--r--src/ipa/libipa/awb_bayes.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/ipa/libipa/awb_bayes.h b/src/ipa/libipa/awb_bayes.h
new file mode 100644
index 00000000..47db7243
--- /dev/null
+++ b/src/ipa/libipa/awb_bayes.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2024 Ideas on Board Oy
+ *
+ * Base class for bayes AWB algorithms
+ */
+
+#pragma once
+
+#include <map>
+#include <memory>
+#include <tuple>
+#include <vector>
+
+#include <libcamera/base/utils.h>
+
+#include <libcamera/control_ids.h>
+#include <libcamera/controls.h>
+
+#include "libcamera/internal/vector.h"
+#include "libcamera/internal/yaml_parser.h"
+
+#include "awb.h"
+#include "interpolator.h"
+#include "pwl.h"
+
+namespace libcamera {
+
+namespace ipa {
+
+class AwbBayes : public AwbAlgorithm
+{
+public:
+ AwbBayes() = default;
+
+ int init(const YamlObject &tuningData) override;
+ AwbResult calculateAwb(const AwbStats &stats, int lux) override;
+ RGB<double> gainsFromColourTemperature(double temperatureK) override;
+ void handleControls(const ControlList &controls) override;
+
+private:
+ int readPriors(const YamlObject &tuningData);
+
+ void fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior,
+ const AwbStats &stats) const;
+ double coarseSearch(const ipa::Pwl &prior, const AwbStats &stats) const;
+ double interpolateQuadratic(ipa::Pwl::Point const &a,
+ ipa::Pwl::Point const &b,
+ ipa::Pwl::Point const &c) const;
+
+ Interpolator<Pwl> priors_;
+ Interpolator<Vector<double, 2>> colourGainCurve_;
+
+ ipa::Pwl ctR_;
+ ipa::Pwl ctB_;
+ ipa::Pwl ctRInverse_;
+ ipa::Pwl ctBInverse_;
+
+ double transversePos_;
+ double transverseNeg_;
+
+ ModeConfig *currentMode_ = nullptr;
+};
+
+} /* namespace ipa */
+
+} /* namespace libcamera */