libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

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, &params_);
     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