enc_butteraugli_comparator.cc (2557B)
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/enc_butteraugli_comparator.h" 7 8 #include "lib/jxl/base/status.h" 9 #include "lib/jxl/enc_image_bundle.h" 10 11 namespace jxl { 12 13 JxlButteraugliComparator::JxlButteraugliComparator( 14 const ButteraugliParams& params, const JxlCmsInterface& cms) 15 : params_(params), cms_(cms) {} 16 17 Status JxlButteraugliComparator::SetReferenceImage(const ImageBundle& ref) { 18 const ImageBundle* ref_linear_srgb; 19 ImageMetadata metadata = *ref.metadata(); 20 ImageBundle store(&metadata); 21 if (!TransformIfNeeded(ref, ColorEncoding::LinearSRGB(ref.IsGray()), cms_, 22 /*pool=*/nullptr, &store, &ref_linear_srgb)) { 23 return false; 24 } 25 JXL_ASSIGN_OR_RETURN(comparator_, ButteraugliComparator::Make( 26 ref_linear_srgb->color(), params_)); 27 xsize_ = ref.xsize(); 28 ysize_ = ref.ysize(); 29 return true; 30 } 31 32 Status JxlButteraugliComparator::SetLinearReferenceImage( 33 const Image3F& linear) { 34 JXL_ASSIGN_OR_RETURN(comparator_, 35 ButteraugliComparator::Make(linear, params_)); 36 xsize_ = linear.xsize(); 37 ysize_ = linear.ysize(); 38 return true; 39 } 40 41 Status JxlButteraugliComparator::CompareWith(const ImageBundle& actual, 42 ImageF* diffmap, float* score) { 43 if (!comparator_) { 44 return JXL_FAILURE("Must set reference image first"); 45 } 46 if (xsize_ != actual.xsize() || ysize_ != actual.ysize()) { 47 return JXL_FAILURE("Images must have same size"); 48 } 49 50 const ImageBundle* actual_linear_srgb; 51 ImageMetadata metadata = *actual.metadata(); 52 ImageBundle store(&metadata); 53 if (!TransformIfNeeded(actual, ColorEncoding::LinearSRGB(actual.IsGray()), 54 cms_, 55 /*pool=*/nullptr, &store, &actual_linear_srgb)) { 56 return false; 57 } 58 59 JXL_ASSIGN_OR_RETURN(ImageF temp_diffmap, ImageF::Create(xsize_, ysize_)); 60 JXL_RETURN_IF_ERROR( 61 comparator_->Diffmap(actual_linear_srgb->color(), temp_diffmap)); 62 63 if (score != nullptr) { 64 *score = ButteraugliScoreFromDiffmap(temp_diffmap, ¶ms_); 65 } 66 if (diffmap != nullptr) { 67 diffmap->Swap(temp_diffmap); 68 } 69 70 return true; 71 } 72 73 float JxlButteraugliComparator::GoodQualityScore() const { 74 return ButteraugliFuzzyInverse(1.5); 75 } 76 77 float JxlButteraugliComparator::BadQualityScore() const { 78 return ButteraugliFuzzyInverse(0.5); 79 } 80 81 } // namespace jxl