diff options
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/contrast.cpp')
-rw-r--r-- | src/ipa/raspberrypi/controller/rpi/contrast.cpp | 118 |
1 files changed, 57 insertions, 61 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/contrast.cpp b/src/ipa/raspberrypi/controller/rpi/contrast.cpp index ae55aad5..16983757 100644 --- a/src/ipa/raspberrypi/controller/rpi/contrast.cpp +++ b/src/ipa/raspberrypi/controller/rpi/contrast.cpp @@ -31,40 +31,40 @@ Contrast::Contrast(Controller *controller) { } -char const *Contrast::Name() const +char const *Contrast::name() const { return NAME; } -void Contrast::Read(boost::property_tree::ptree const ¶ms) +void Contrast::read(boost::property_tree::ptree const ¶ms) { // enable adaptive enhancement by default - config_.ce_enable = params.get<int>("ce_enable", 1); + config_.ceEnable = params.get<int>("ce_enable", 1); // the point near the bottom of the histogram to move - config_.lo_histogram = params.get<double>("lo_histogram", 0.01); + config_.loHistogram = params.get<double>("lo_histogram", 0.01); // where in the range to try and move it to - config_.lo_level = params.get<double>("lo_level", 0.015); + config_.loLevel = params.get<double>("lo_level", 0.015); // but don't move by more than this - config_.lo_max = params.get<double>("lo_max", 500); + config_.loMax = params.get<double>("lo_max", 500); // equivalent values for the top of the histogram... - config_.hi_histogram = params.get<double>("hi_histogram", 0.95); - config_.hi_level = params.get<double>("hi_level", 0.95); - config_.hi_max = params.get<double>("hi_max", 2000); - config_.gamma_curve.Read(params.get_child("gamma_curve")); + config_.hiHistogram = params.get<double>("hi_histogram", 0.95); + config_.hiLevel = params.get<double>("hi_level", 0.95); + config_.hiMax = params.get<double>("hi_max", 2000); + config_.gammaCurve.read(params.get_child("gamma_curve")); } -void Contrast::SetBrightness(double brightness) +void Contrast::setBrightness(double brightness) { brightness_ = brightness; } -void Contrast::SetContrast(double contrast) +void Contrast::setContrast(double contrast) { contrast_ = contrast; } -static void fill_in_status(ContrastStatus &status, double brightness, - double contrast, Pwl &gamma_curve) +static void fillInStatus(ContrastStatus &status, double brightness, + double contrast, Pwl &gammaCurve) { status.brightness = brightness; status.contrast = contrast; @@ -73,104 +73,100 @@ static void fill_in_status(ContrastStatus &status, double brightness, : (i < 24 ? (i - 16) * 2048 + 16384 : (i - 24) * 4096 + 32768); status.points[i].x = x; - status.points[i].y = std::min(65535.0, gamma_curve.Eval(x)); + status.points[i].y = std::min(65535.0, gammaCurve.eval(x)); } status.points[CONTRAST_NUM_POINTS - 1].x = 65535; status.points[CONTRAST_NUM_POINTS - 1].y = 65535; } -void Contrast::Initialise() +void Contrast::initialise() { // Fill in some default values as Prepare will run before Process gets // called. - fill_in_status(status_, brightness_, contrast_, config_.gamma_curve); + fillInStatus(status_, brightness_, contrast_, config_.gammaCurve); } -void Contrast::Prepare(Metadata *image_metadata) +void Contrast::prepare(Metadata *imageMetadata) { std::unique_lock<std::mutex> lock(mutex_); - image_metadata->Set("contrast.status", status_); + imageMetadata->set("contrast.status", status_); } -Pwl compute_stretch_curve(Histogram const &histogram, - ContrastConfig const &config) +Pwl computeStretchCurve(Histogram const &histogram, + ContrastConfig const &config) { Pwl enhance; - enhance.Append(0, 0); + enhance.append(0, 0); // If the start of the histogram is rather empty, try to pull it down a // bit. - double hist_lo = histogram.Quantile(config.lo_histogram) * - (65536 / NUM_HISTOGRAM_BINS); - double level_lo = config.lo_level * 65536; + double histLo = histogram.quantile(config.loHistogram) * + (65536 / NUM_HISTOGRAM_BINS); + double levelLo = config.loLevel * 65536; LOG(RPiContrast, Debug) - << "Move histogram point " << hist_lo << " to " << level_lo; - hist_lo = std::max( - level_lo, - std::min(65535.0, std::min(hist_lo, level_lo + config.lo_max))); + << "Move histogram point " << histLo << " to " << levelLo; + histLo = std::max(levelLo, + std::min(65535.0, std::min(histLo, levelLo + config.loMax))); LOG(RPiContrast, Debug) - << "Final values " << hist_lo << " -> " << level_lo; - enhance.Append(hist_lo, level_lo); + << "Final values " << histLo << " -> " << levelLo; + enhance.append(histLo, levelLo); // Keep the mid-point (median) in the same place, though, to limit the // apparent amount of global brightness shift. - double mid = histogram.Quantile(0.5) * (65536 / NUM_HISTOGRAM_BINS); - enhance.Append(mid, mid); + double mid = histogram.quantile(0.5) * (65536 / NUM_HISTOGRAM_BINS); + enhance.append(mid, mid); // If the top to the histogram is empty, try to pull the pixel values // there up. - double hist_hi = histogram.Quantile(config.hi_histogram) * - (65536 / NUM_HISTOGRAM_BINS); - double level_hi = config.hi_level * 65536; + double histHi = histogram.quantile(config.hiHistogram) * + (65536 / NUM_HISTOGRAM_BINS); + double levelHi = config.hiLevel * 65536; LOG(RPiContrast, Debug) - << "Move histogram point " << hist_hi << " to " << level_hi; - hist_hi = std::min( - level_hi, - std::max(0.0, std::max(hist_hi, level_hi - config.hi_max))); + << "Move histogram point " << histHi << " to " << levelHi; + histHi = std::min(levelHi, + std::max(0.0, std::max(histHi, levelHi - config.hiMax))); LOG(RPiContrast, Debug) - << "Final values " << hist_hi << " -> " << level_hi; - enhance.Append(hist_hi, level_hi); - enhance.Append(65535, 65535); + << "Final values " << histHi << " -> " << levelHi; + enhance.append(histHi, levelHi); + enhance.append(65535, 65535); return enhance; } -Pwl apply_manual_contrast(Pwl const &gamma_curve, double brightness, - double contrast) +Pwl applyManualContrast(Pwl const &gammaCurve, double brightness, + double contrast) { - Pwl new_gamma_curve; + Pwl newGammaCurve; LOG(RPiContrast, Debug) << "Manual brightness " << brightness << " contrast " << contrast; - gamma_curve.Map([&](double x, double y) { - new_gamma_curve.Append( + gammaCurve.map([&](double x, double y) { + newGammaCurve.append( x, std::max(0.0, std::min(65535.0, (y - 32768) * contrast + 32768 + brightness))); }); - return new_gamma_curve; + return newGammaCurve; } -void Contrast::Process(StatisticsPtr &stats, - [[maybe_unused]] Metadata *image_metadata) +void Contrast::process(StatisticsPtr &stats, + [[maybe_unused]] Metadata *imageMetadata) { Histogram histogram(stats->hist[0].g_hist, NUM_HISTOGRAM_BINS); // We look at the histogram and adjust the gamma curve in the following // ways: 1. Adjust the gamma curve so as to pull the start of the // histogram down, and possibly push the end up. - Pwl gamma_curve = config_.gamma_curve; - if (config_.ce_enable) { - if (config_.lo_max != 0 || config_.hi_max != 0) - gamma_curve = compute_stretch_curve(histogram, config_) - .Compose(gamma_curve); + Pwl gammaCurve = config_.gammaCurve; + if (config_.ceEnable) { + if (config_.loMax != 0 || config_.hiMax != 0) + gammaCurve = computeStretchCurve(histogram, config_).compose(gammaCurve); // We could apply other adjustments (e.g. partial equalisation) // based on the histogram...? } // 2. Finally apply any manually selected brightness/contrast // adjustment. if (brightness_ != 0 || contrast_ != 1.0) - gamma_curve = apply_manual_contrast(gamma_curve, brightness_, - contrast_); + gammaCurve = applyManualContrast(gammaCurve, brightness_, contrast_); // And fill in the status for output. Use more points towards the bottom // of the curve. ContrastStatus status; - fill_in_status(status, brightness_, contrast_, gamma_curve); + fillInStatus(status, brightness_, contrast_, gammaCurve); { std::unique_lock<std::mutex> lock(mutex_); status_ = status; @@ -178,8 +174,8 @@ void Contrast::Process(StatisticsPtr &stats, } // Register algorithm with the system. -static Algorithm *Create(Controller *controller) +static Algorithm *create(Controller *controller) { return (Algorithm *)new Contrast(controller); } -static RegisterAlgorithm reg(NAME, &Create); +static RegisterAlgorithm reg(NAME, &create); |