histogram matching: handle the case in which the thumbnail and the raw have different aspect ratios

This commit is contained in:
Alberto Griggio
2018-01-18 23:36:03 +01:00
parent 7b3e9f7b7a
commit 4feb663f63

View File

@@ -29,6 +29,7 @@
#define BENCHMARK
#include "StopWatch.h"
#include <iostream>
#include <iomanip>
namespace rtengine {
@@ -139,18 +140,62 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector<double> &outCurve)
}
outCurve = { DCT_Linear };
int fw, fh;
getFullSize(fw, fh, TR_NONE);
int skip = 10;
if (settings->verbose) {
std::cout << "histogram matching: full raw image size is " << fw << "x" << fh << std::endl;
}
ProcParams neutral;
std::unique_ptr<IImage8> source;
{
RawMetaDataLocation rml;
eSensorType sensor_type;
int w, h;
std::unique_ptr<Thumbnail> thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true));
if (!thumb) {
if (settings->verbose) {
std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl;
}
return;
}
source.reset(thumb->quickProcessImage(neutral, fh / skip, TI_Nearest));
if (settings->verbose) {
std::cout << "histogram matching: extracted embedded thumbnail" << std::endl;
}
}
std::unique_ptr<IImage8> target;
{
int tr = TR_NONE;
int fw, fh;
getFullSize(fw, fh, tr);
int skip = 10;
{
int tw = source->getWidth(), th = source->getHeight();
float thumb_ratio = float(std::max(tw, th)) / float(std::min(tw, th));
float target_ratio = float(std::max(fw, fh)) / float(std::min(fw, fh));
int cx = 0, cy = 0;
if (std::abs(thumb_ratio - target_ratio) > 0.01) {
if (thumb_ratio > target_ratio) {
// crop the height
int ch = fh - (fw * float(th) / float(tw));
cy += ch / 2;
fh -= ch;
} else {
// crop the width
int cw = fw - (fh * float(tw) / float(th));
cx += cw / 2;
fw -= cw;
}
if (settings->verbose) {
std::cout << "histogram matching: cropping target to get an aspect ratio of " << std::fixed << std::setprecision(2) << thumb_ratio << ":1, new full size is " << fw << "x" << fh << std::endl;
}
}
PreviewProps pp(0, 0, fw, fh, skip);
ColorTemp currWB = getWB();
std::unique_ptr<Imagefloat> image(new Imagefloat(int(fw / skip), int(fh / skip)));
getImage(currWB, tr, image.get(), pp, neutral.toneCurve, neutral.raw);
getImage(currWB, TR_NONE, image.get(), pp, neutral.toneCurve, neutral.raw);
// this could probably be made faster -- ideally we would need to just
// perform the transformation from camera space to the output space
@@ -168,24 +213,6 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector<double> &outCurve)
std::cout << "histogram matching: generated neutral rendering" << std::endl;
}
}
std::unique_ptr<IImage8> source;
{
RawMetaDataLocation rml;
eSensorType sensor_type;
int w, h;
std::unique_ptr<Thumbnail> thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true));
if (!thumb) {
if (settings->verbose) {
std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl;
}
return;
}
source.reset(thumb->quickProcessImage(neutral, target->getHeight(), TI_Nearest));
if (settings->verbose) {
std::cout << "histogram matching: extracted embedded thumbnail" << std::endl;
}
}
if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) {
Image8 *tmp = new Image8(source->getWidth(), source->getHeight());
target->resizeImgTo(source->getWidth(), source->getHeight(), TI_Nearest, tmp);