satdump/src-core/image/meta.h
2025-07-23 12:21:02 +02:00

145 lines
No EOL
4.2 KiB
C++

#pragma once
/**
* @file meta.h
* @brief Image Metadata manipulation
*/
#include "image.h"
#include "nlohmann/json.hpp"
namespace satdump
{
namespace image
{
/**
* @brief Check if an image has metadata
* @param img the image
* @return true if the image has metadata
*/
bool has_metadata(Image &img);
/**
* @brief Set an image's metadata
* @param img the image
* @param metadata to set as JSON object
*/
void set_metadata(Image &img, nlohmann::json metadata);
/**
* @brief Get an image's metadata
* @param img the image
* @return metadata as JSON object
*/
nlohmann::json get_metadata(const Image &img);
/**
* @brief Delete the image's metadata
* @param img the image
*/
void free_metadata(const Image &img);
/**
* @brief Check if an image has a projection
* @param img the image
* @return true if the image has a projection
*/
bool has_metadata_proj_cfg(Image &img);
/**
* @brief Set an image's projection metadata
* @param img the image
* @param proj_cfg Projection to set
*/
void set_metadata_proj_cfg(Image &img, nlohmann::json proj_cfg);
/**
* @brief Get an image's projection
* @param img the image
* @return the projection as JSON
*/
nlohmann::json get_metadata_proj_cfg(const Image &img);
/**
* @brief Image Calibration Handler.
* This handles converting between raw pixel values
* and calibrated/physical units. It is a simple linear
* transform.
*
* @param unit calibrated unit (or name)
* @param scale scale (a of ax+b function)
* @param offset offset (b of ax+b function)
*/
struct ImgCalibHandler
{
std::string unit;
double scale = 0;
double offset = 0;
double min = 0, max = 0;
friend void to_json(nlohmann::json &j, const ImgCalibHandler &v)
{
j["unit"] = v.unit;
if (v.offset == 0 && v.scale == 0)
{
j["offset"] = v.min;
j["scale"] = v.max - v.min;
}
else
{
j["offset"] = v.offset;
j["scale"] = v.scale;
}
}
friend void from_json(const nlohmann::json &j, ImgCalibHandler &v)
{
v.unit = j["unit"];
if (j.contains("offset"))
v.offset = j["offset"];
if (j.contains("scale"))
v.scale = j["scale"];
v.min = v.offset;
v.max = v.offset + v.scale;
}
/**
* @brief Convert from raw image value to calibration
* @param img_val the raw pixel value
* @return calibrated value
*/
inline double getVal(double img_val) { return img_val * scale + offset; }
/**
* @brief Convert from calibrated value to raw image value
* @param cal_val the calibrated value
* @return raw pixel value
*/
inline double setVal(double cal_val) { return (cal_val - offset) / scale; }
};
/**
* @brief Check if an image has a calibration config
* @param img the image
* @return true if the image has calibration
*/
bool has_metadata_calib_cfg(Image &img);
/**
* @brief Set an image's calibration metadata
* @param img the image
* @param proj_cfg calibration to set
*/
void set_metadata_calib_cfg(Image &img, nlohmann::json calib_cfg);
/**
* @brief Get an image's calibration
* @param img the image
* @return the calibration as JSON
*/
nlohmann::json get_metadata_calib_cfg(const Image &img);
} // namespace image
} // namespace satdump