Compare commits

...

2 Commits

Author SHA1 Message Date
Alexander Smorkalov
ac33ba8f18 Merge pull request #30719 from pbkx:port-tonemap-reinhard-intensity-5x
photo: preserve TonemapReinhard intensity during processing
2026-11-08 20:26:08 +03:00
pbkx
5d1f514835 preserve TonemapReinhard intensity during processing 2026-11-08 02:31:03 -08:00
2 changed files with 23 additions and 2 deletions

View File

@@ -233,7 +233,7 @@ public:
float key = (log_max - log_mean) / (log_max - log_min);
float map_key = 0.3f + 0.7f * std::pow(key, 1.4f);
intensity = exp(-intensity);
const float intensity_scale = exp(-intensity);
Scalar chan_mean = mean(img);
float gray_mean = static_cast<float>(mean(gray_img)[0]);
@@ -244,7 +244,7 @@ public:
float global = color_adapt * static_cast<float>(chan_mean[i]) + (1.0f - color_adapt) * gray_mean;
Mat adapt = color_adapt * channels[i] + (1.0f - color_adapt) * gray_img;
adapt = light_adapt * adapt + (1.0f - light_adapt) * global;
pow(intensity * adapt, map_key, adapt);
pow(intensity_scale * adapt, map_key, adapt);
channels[i] = channels[i].mul(1.0f / (adapt + channels[i]));
}
gray_img.release();

View File

@@ -118,6 +118,27 @@ TEST(Photo_Tonemap, regression)
checkEqual(result, expected, 3, "Mantiuk");
}
TEST(Photo_Tonemap, reinhard_preserves_intensity)
{
string test_path = string(cvtest::TS::ptr()->get_data_path()) + "hdr/tonemap/";
Mat img, first, second;
loadImage(test_path + "image.hdr", img);
Mat original = img.clone();
Ptr<TonemapReinhard> tonemap = createTonemapReinhard(1.0f, 0.0f, 1.0f, 0.0f);
EXPECT_FLOAT_EQ(0.0f, tonemap->getIntensity());
tonemap->process(img, first);
EXPECT_FLOAT_EQ(0.0f, tonemap->getIntensity());
tonemap->process(img, second);
EXPECT_FLOAT_EQ(0.0f, tonemap->getIntensity());
checkEqual(first, second, 0, "Reinhard repeated process");
checkEqual(img, original, 0, "Reinhard input preservation");
}
TEST(Photo_AlignMTB, regression)
{
const int TESTS_COUNT = 100;