butteraugli_test.cc (3807B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include "lib/jxl/butteraugli/butteraugli.h" 7 8 #include <jxl/memory_manager.h> 9 #include <jxl/types.h> 10 11 #include <algorithm> 12 #include <cstddef> 13 #include <cstdint> 14 #include <utility> 15 16 #include "lib/extras/metrics.h" 17 #include "lib/extras/packed_image.h" 18 #include "lib/jxl/base/random.h" 19 #include "lib/jxl/base/status.h" 20 #include "lib/jxl/enc_external_image.h" 21 #include "lib/jxl/image.h" 22 #include "lib/jxl/image_ops.h" 23 #include "lib/jxl/test_image.h" 24 #include "lib/jxl/test_memory_manager.h" 25 #include "lib/jxl/test_utils.h" 26 #include "lib/jxl/testing.h" 27 28 namespace jxl { 29 namespace { 30 31 using ::jxl::extras::PackedImage; 32 using ::jxl::extras::PackedPixelFile; 33 using ::jxl::test::GetColorImage; 34 using ::jxl::test::TestImage; 35 36 Image3F SinglePixelImage(float red, float green, float blue) { 37 JxlMemoryManager* memory_manager = jxl::test::MemoryManager(); 38 JXL_TEST_ASSIGN_OR_DIE(Image3F img, Image3F::Create(memory_manager, 1, 1)); 39 img.PlaneRow(0, 0)[0] = red; 40 img.PlaneRow(1, 0)[0] = green; 41 img.PlaneRow(2, 0)[0] = blue; 42 return img; 43 } 44 45 void AddUniformNoise(Image3F* img, float d, uint64_t seed) { 46 Rng generator(seed); 47 for (size_t y = 0; y < img->ysize(); ++y) { 48 for (int c = 0; c < 3; ++c) { 49 for (size_t x = 0; x < img->xsize(); ++x) { 50 img->PlaneRow(c, y)[x] += generator.UniformF(-d, d); 51 } 52 } 53 } 54 } 55 56 void AddEdge(Image3F* img, float d, size_t x0, size_t y0) { 57 const size_t h = std::min<size_t>(img->ysize() - y0, 100); 58 const size_t w = std::min<size_t>(img->xsize() - x0, 5); 59 for (size_t dy = 0; dy < h; ++dy) { 60 for (size_t dx = 0; dx < w; ++dx) { 61 img->PlaneRow(1, y0 + dy)[x0 + dx] += d; 62 } 63 } 64 } 65 66 TEST(ButteraugliInPlaceTest, SinglePixel) { 67 Image3F rgb0 = SinglePixelImage(0.5f, 0.5f, 0.5f); 68 Image3F rgb1 = SinglePixelImage(0.5f, 0.49f, 0.5f); 69 ButteraugliParams butteraugli_params; 70 ImageF diffmap; 71 double diffval; 72 EXPECT_TRUE( 73 ButteraugliInterface(rgb0, rgb1, butteraugli_params, diffmap, diffval)); 74 EXPECT_NEAR(diffval, 2.5, 0.5); 75 ImageF diffmap2; 76 double diffval2; 77 EXPECT_TRUE(ButteraugliInterfaceInPlace(std::move(rgb0), std::move(rgb1), 78 butteraugli_params, diffmap2, 79 diffval2)); 80 EXPECT_NEAR(diffval, diffval2, 1e-10); 81 } 82 83 TEST(ButteraugliInPlaceTest, LargeImage) { 84 JxlMemoryManager* memory_manager = jxl::test::MemoryManager(); 85 const size_t xsize = 1024; 86 const size_t ysize = 1024; 87 TestImage img; 88 ASSERT_TRUE(img.SetDimensions(xsize, ysize)); 89 JXL_TEST_ASSIGN_OR_DIE(auto frame, img.AddFrame()); 90 frame.RandomFill(777); 91 JXL_TEST_ASSIGN_OR_DIE(Image3F rgb0, GetColorImage(img.ppf())); 92 JXL_TEST_ASSIGN_OR_DIE(Image3F rgb1, 93 Image3F::Create(memory_manager, xsize, ysize)); 94 ASSERT_TRUE(CopyImageTo(rgb0, &rgb1)); 95 AddUniformNoise(&rgb1, 0.02f, 7777); 96 AddEdge(&rgb1, 0.1f, xsize / 2, xsize / 2); 97 ButteraugliParams butteraugli_params; 98 ImageF diffmap; 99 double diffval; 100 EXPECT_TRUE( 101 ButteraugliInterface(rgb0, rgb1, butteraugli_params, diffmap, diffval)); 102 double distp = ComputeDistanceP(diffmap, butteraugli_params, 3.0); 103 EXPECT_NEAR(diffval, 4.0, 0.5); 104 EXPECT_NEAR(distp, 1.5, 0.5); 105 ImageF diffmap2; 106 double diffval2; 107 EXPECT_TRUE(ButteraugliInterfaceInPlace(std::move(rgb0), std::move(rgb1), 108 butteraugli_params, diffmap2, 109 diffval2)); 110 double distp2 = ComputeDistanceP(diffmap2, butteraugli_params, 3.0); 111 EXPECT_NEAR(diffval, diffval2, 5e-7); 112 EXPECT_NEAR(distp, distp2, 1e-7); 113 } 114 115 } // namespace 116 } // namespace jxl