mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
145 lines
No EOL
4.2 KiB
C++
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
|