diff options
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/sharpen.cpp')
-rw-r--r-- | src/ipa/raspberrypi/controller/rpi/sharpen.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp index 4c2fdb3e..2b701db5 100644 --- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp @@ -17,7 +17,7 @@ using namespace RPi; #define NAME "rpi.sharpen" Sharpen::Sharpen(Controller *controller) - : Algorithm(controller) + : SharpenAlgorithm(controller), user_strength_(1.0) { } @@ -42,14 +42,32 @@ void Sharpen::Read(boost::property_tree::ptree const ¶ms) limit_ = params.get<double>("limit", 1.0); } +void Sharpen::SetStrength(double strength) +{ + // Note that this method is how an application sets the overall + // sharpening "strength". We call this the "user strength" field + // as there already is a strength_ field - being an internal gain + // parameter that gets passed to the ISP control code. Negative + // values are not allowed - coerce them to zero (no sharpening). + user_strength_ = std::max(0.0, strength); +} + void Sharpen::Prepare(Metadata *image_metadata) { + // The user_strength_ affects the algorithm's internal gain directly, but + // we adjust the limit and threshold less aggressively. Using a sqrt + // function is an arbitrary but gentle way of accomplishing this. + double user_strength_sqrt = sqrt(user_strength_); struct SharpenStatus status; // Binned modes seem to need the sharpening toned down with this - // pipeline. - status.threshold = threshold_ * mode_factor_; - status.strength = strength_ / mode_factor_; - status.limit = limit_ / mode_factor_; + // pipeline, thus we use the mode_factor here. Also avoid + // divide-by-zero with the user_strength_sqrt. + status.threshold = threshold_ * mode_factor_ / + std::max(0.01, user_strength_sqrt); + status.strength = strength_ / mode_factor_ * user_strength_; + status.limit = limit_ / mode_factor_ * user_strength_sqrt; + // Finally, report any application-supplied parameters that were used. + status.user_strength = user_strength_; image_metadata->Set("sharpen.status", status); } |