17#include <peak_icv_c/algorithms/preprocessing/peak_icv_tone_curve_correction.h>
26class DigitalBlackFeature;
261#ifndef DOXYGEN_SHOULD_SKIP_THIS
267 void ApplyGamma(
float value)
const;
269 void ApplyDigitalBlack(
float value)
const;
270 void SetGammaEnabled(
bool enabled);
271 void SetDigitalBlackEnabled(
bool enabled);
275 static constexpr int moduleVersion{ 1 };
276 static constexpr auto gammaKey{
"Gamma" };
277 static constexpr auto digitalBlackKey{
"DigitalBlack" };
279 static constexpr auto gammaDefault = 1.0F;
280 static constexpr auto digitalBlackDefault = 0.0F;
282 peak_icv_tone_curve_correction_handle m_handle{};
283 bool m_gammaEnabled{
true };
284 bool m_digitalBlackEnabled{
true };
286 float m_gamma{ gammaDefault };
287 float m_digitalBlack{ digitalBlackDefault };
293 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_Create(&m_handle);
299 if (m_handle !=
nullptr)
301 std::ignore = PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_Destroy(m_handle);
307 m_handle = std::exchange(other.m_handle,
nullptr);
308 m_gammaEnabled = other.m_gammaEnabled;
309 m_gamma = other.m_gamma;
310 m_digitalBlackEnabled = other.m_digitalBlackEnabled;
311 m_digitalBlack = other.m_digitalBlack;
318 if (m_handle !=
nullptr)
321 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_Destroy(m_handle);
325 m_handle = std::exchange(other.m_handle,
nullptr);
326 m_gammaEnabled = other.m_gammaEnabled;
327 m_gamma = other.m_gamma;
328 m_digitalBlackEnabled = other.m_digitalBlackEnabled;
329 m_digitalBlack = other.m_digitalBlack;
337 archive.
SetInt(
"Version", moduleVersion);
342 gammaArchive->SetBool(
"Enabled", m_gammaEnabled);
343 digitalBlackArchive->SetBool(
"Enabled", m_digitalBlackEnabled);
345 gammaArchive->SetDouble(
"Value", m_gamma);
346 digitalBlackArchive->SetDouble(
"Value", m_digitalBlack);
349 archive.
SetArchive(digitalBlackKey, digitalBlackArchive);
354 const auto version = archive.
GetInt(
"Version");
358 const auto gammaArchive = archive.
GetArchive(gammaKey);
359 const auto digitalBlackArchive = archive.
GetArchive(digitalBlackKey);
361 m_gammaEnabled = gammaArchive->GetBool(
"Enabled");
362 m_digitalBlackEnabled = digitalBlackArchive->GetBool(
"Enabled");
364 m_gamma =
static_cast<float>(gammaArchive->GetDouble(
"Value"));
365 m_digitalBlack =
static_cast<float>(digitalBlackArchive->GetDouble(
"Value"));
367 ApplyGamma(m_gammaEnabled ? m_gamma : gammaDefault);
368 ApplyDigitalBlack(m_digitalBlackEnabled ? m_digitalBlack : digitalBlackDefault);
373 m_gammaEnabled = enabled;
374 m_digitalBlackEnabled = enabled;
379 return m_gammaEnabled || m_digitalBlackEnabled;
384 return "ToneCurveCorrection";
389 ApplyGamma(gammaDefault);
390 ApplyDigitalBlack(digitalBlackDefault);
405 peak_common_interval_f cRange{};
407 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_GetGammaRange(m_handle, &cRange);
410 return peak::common::detail::BackendAccessor<peak::common::IntervalF>::CreateInstance(cRange);
415 peak_common_interval_f cRange{};
417 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_GetDigitalBlackRange(m_handle, &cRange);
420 return peak::common::detail::BackendAccessor<peak::common::IntervalF>::CreateInstance(cRange);
435 if (!m_digitalBlackEnabled)
437 return m_digitalBlack;
439 return FetchDigitalBlack();
444 m_digitalBlack = digitalBlack;
446 if (m_digitalBlackEnabled)
448 ApplyDigitalBlack(digitalBlack);
459 auto needsProcessing = [&] {
462 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_NeedsProcessing(m_handle, &value);
483 if (!isSupportedMonoImage && !isSupportedColorImage)
488 auto*
const inputImageHandle = peak::common::detail::BackendAccessor<peak::icv::Image>::BackendHandle(inputImage);
491 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_ProcessInplace(m_handle, inputImageHandle);
497inline float ToneCurveCorrectionModule::FetchGamma()
const
501 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_GetGamma(m_handle, &value);
506inline void ToneCurveCorrectionModule::ApplyGamma(
float value)
const
509 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_SetGamma(m_handle, value);
513inline float ToneCurveCorrectionModule::FetchDigitalBlack()
const
517 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_GetDigitalBlack(m_handle, &value);
522inline void ToneCurveCorrectionModule::ApplyDigitalBlack(
float value)
const
525 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ToneCurveCorrection_SetDigitalBlack(m_handle, value);
529inline void ToneCurveCorrectionModule::SetGammaEnabled(
bool enabled)
531 m_gammaEnabled = enabled;
533 ApplyGamma(enabled ? m_gamma : gammaDefault);
536inline void ToneCurveCorrectionModule::SetDigitalBlackEnabled(
bool enabled)
538 m_digitalBlackEnabled = enabled;
540 ApplyDigitalBlack(enabled ? m_digitalBlack : digitalBlackDefault);
543inline bool ToneCurveCorrectionModule::IsGammaEnabled()
const
545 return m_gammaEnabled;
548inline bool ToneCurveCorrectionModule::IsDigitalBlackEnabled()
const
550 return m_digitalBlackEnabled;
A type-erased container for any copyable value.
T & AnyCast()
Casts the stored value to the specified type.
Represents a continuous numeric interval with inclusive lower and upper bounds.
Interface for a hierarchical key-value archive system.
virtual std::shared_ptr< IArchive > GetArchive(const std::string &key) const =0
Retrieves a nested archive by key.
virtual void SetInt(const std::string &key, int64_t value)=0
Stores a 64-bit signed integer.
virtual int64_t GetInt(const std::string &key) const =0
Retrieves a 64-bit signed integer by key.
virtual std::shared_ptr< IArchive > CreateArchive() const =0
Creates a new, empty archive instance.
virtual void SetArchive(const std::string &key, const std::shared_ptr< IArchive > &value)=0
Stores a nested archive object.
For detailed information about the use of ids_peak_icv Image refer to the Image Guide.
peak::common::PixelFormat GetPixelFormat() const
Provides the pixel format of the image.
Tone curve correction is an image pipeline module that applies digital black correction and inverse g...
~ToneCurveCorrectionModule() override
const char * GetType() const override
Returns the type of the module for serialization purposes.
void SetDigitalBlack(float digitalBlack)
Sets the digital black used for digital black correction.
peak::common::IntervalF GetDigitalBlackRange() const
Returns the valid range for the digital black correction value.
ToneCurveCorrectionModule & operator=(const ToneCurveCorrectionModule &other)=delete
Copy assignment for class ToneCurveCorrectionModule is deleted.
void SetGamma(float gamma)
Sets the gamma correction exponent.
float GetGamma() const
Gets the current gamma correction exponent.
peak::common::IntervalF GetGammaRange() const
Returns the valid range for the gamma correction exponent.
void Serialize(peak::common::serialization::IArchive &archive) const override
Serializes the object's internal state into the provided archive.
ToneCurveCorrectionModule(const ToneCurveCorrectionModule &other)=delete
Copy constructor for class ToneCurveCorrectionModule is deleted.
peak::icv::Image Process(const peak::icv::Image &input) const
Processes the input image and returns a tone curve corrected output image.
void SetEnabled(bool enabled) override
Sets the enabled state of this module.
ToneCurveCorrectionModule()
Creates an instance of class ToneCurveCorrectionModule with default values for gamma and black.
void Deserialize(const peak::common::serialization::IArchive &archive) override
Restores the object's state from the provided archive.
void ResetToDefault() override
Resets all settings to the default values for gamma and black.
float GetDigitalBlack() const
Gets the current digital black used for correction.
bool IsEnabled() const override
Checks if the module is currently enabled.
Digital black applies digital black correction to an image.
Gamma applies an inverse gamma transformation to an image.
Interface for a module used within a pipeline.
#define PEAK_COMMON_NO_DISCARD
Compatability macro for the nodiscard attribute.
@ Mono12
Mono 12-Bit pixel format.
@ BGR10p32
BGR 10-Bit packed 32-bit format.
@ Mono16
Mono 16-Bit pixel format.
@ Mono10
Mono 10-Bit pixel format.
@ Mono8
Mono 8-Bit pixel format.
@ RGB10p32
RGB 10-Bit packed 32-bit format.
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
void ValidateVersion(int64_t version, const std::string &moduleName)