satdump/src-testing/main_gengoesn_lut.cpp

105 lines
No EOL
3.8 KiB
C++

/**********************************************************************
* This file is used for testing random stuff without running the
* whole of SatDump, which comes in handy for debugging individual
* elements before putting them all together in modules...
*
* If you are an user, ignore this file which will not be built by
* default, and if you're a developper in need of doing stuff here...
* Go ahead!
*
* Don't judge the code you might see in there! :)
**********************************************************************/
#include "image/brightness_contrast.h"
#include "image/hue_saturation.h"
#include "image/image.h"
#include "image/io.h"
#include "logger.h"
#include "core/resources.h"
image::Image applyLut(image::Image image3, image::Image image5)
{
// If we can, generate false color
if (resources::resourceExists("lut/goes/gvar/lut.png"))
{
// logger->trace("Scale Ch1 to 8-bits...");
image::Image channel1(8, image5.width(), image5.height(), 1);
for (size_t i = 0; i < channel1.width() * channel1.height(); i++)
channel1.set(i, image5.get(i) / 255);
image5.clear(); // We're done with Ch1. Free up memory
// logger->trace("Scale Ch4 to 8-bits...");
image::Image channel4(8, image3.width(), image3.height(), 1);
for (size_t i = 0; i < channel4.width() * channel4.height(); i++)
channel4.set(i, image3.get(i) / 255);
image3.clear(); // We're done with Ch4. Free up memory
// logger->trace("Resize images...");
channel4.resize(channel1.width(), channel1.height());
// logger->trace("Loading LUT...");
image::Image lutImage;
image::load_png(lutImage, resources::getResourcePath("lut/goes/gvar/lut.png").c_str());
lutImage.resize(256, 256);
// logger->trace("Loading correction curve...");
image::Image curveImage;
image::load_png(curveImage, resources::getResourcePath("lut/goes/gvar/curve_goesn.png").c_str());
image::Image compoImage(8, channel1.width(), channel1.height(), 3);
// logger->trace("Applying LUT...");
for (size_t i = 0; i < channel1.width() * channel1.height(); i++)
{
uint8_t x = 255 - curveImage.get(channel1.get(i)) / 1.5;
uint8_t y = channel4.get(i);
for (int c = 0; c < 3; c++)
compoImage.set(c * compoImage.width() * compoImage.height() + i, lutImage.get(c * lutImage.width() * lutImage.height() + x * lutImage.width() + y));
}
// logger->trace("Contrast correction...");
image::brightness_contrast(compoImage, -10.0f / 127.0f, 24.0f / 127.0f);
// logger->trace("Hue shift...");
image::HueSaturation hueTuning;
hueTuning.hue[image::HUE_RANGE_MAGENTA] = 133.0 / 180.0;
hueTuning.overlap = 100.0 / 100.0;
image::hue_saturation(compoImage, hueTuning);
return compoImage;
}
else
{
logger->warn("lut/goes/gvar/lut.png LUT is missing! False Color will not be generated");
}
}
int main(int argc, char *argv[])
{
initLogger();
image::Image finalLut(8, 256, 256, 3);
for (int ch1_val = 0; ch1_val < 256; ch1_val++)
{
logger->critical(ch1_val);
for (int ch4_val = 0; ch4_val < 256; ch4_val++)
{
image::Image ch1(16, 2, 2, 1);
ch1.fill(ch1_val << 8);
image::Image ch4(16, 2, 2, 1);
ch4.fill(ch4_val << 8);
auto out = applyLut(ch4, ch1);
finalLut.set(0, ch1_val, ch4_val, out.get(0, 0, 0));
finalLut.set(1, ch1_val, ch4_val, out.get(1, 0, 0));
finalLut.set(2, ch1_val, ch4_val, out.get(2, 0, 0));
}
}
image::save_png(finalLut, "/tmp/fc_lut.png");
return 0;
}