otbCompareImages.cxx 9.19 KiB
/*
 * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES)
 * This file is part of Orfeo Toolbox
 *     https://www.orfeo-toolbox.org/
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
#include "otbWrapperApplication.h"
#include "otbWrapperApplicationFactory.h"
#include "otbMultiToMonoChannelExtractROI.h"
#include "otbStreamingCompareImageFilter.h"
namespace otb
namespace Wrapper
class CompareImages : public Application
public:
  /** Standard class typedefs. */
  typedef CompareImages             Self;
  typedef Application                   Superclass;
  typedef itk::SmartPointer<Self>       Pointer;
  typedef itk::SmartPointer<const Self> ConstPointer;
  /** Standard macro */
  itkNewMacro(Self);
  itkTypeMacro(CompareImages, otb::Application);
  /** Filters typedef */
  typedef otb::MultiToMonoChannelExtractROI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType> ExtractROIMonoFilterType;
  typedef otb::StreamingCompareImageFilter<FloatImageType> StreamingCompareImageFilterType;
private:
  void DoInit() override
    SetName("CompareImages");
    SetDescription("Estimator between 2 images.");
    // Documentation
    SetDocLongDescription(
        "Compute MSE (Mean Squared Error), MAE (Mean Absolute Error) and PSNR (Peak Signal to Noise Ratio) between two image bands (reference and measurement). "
        "The user has to set the used channel and can specify a ROI."
    SetDocLimitations("None");
    SetDocAuthors("OTB-Team");
    SetDocSeeAlso("BandMath application, ImageStatistics");
    AddDocTag(Tags::Manip);
    AddParameter(ParameterType_Group, "ref", "Reference image properties");
    AddParameter(ParameterType_InputImage,  "ref.in",   "Reference image");
    SetParameterDescription("ref.in", "Image used as reference in the comparison.");
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
AddParameter(ParameterType_Int, "ref.channel", "Reference image channel"); SetParameterDescription("ref.channel", "Used channel for the reference image."); SetDefaultParameterInt("ref.channel", 1); SetMinimumParameterIntValue("ref.channel", 1); AddParameter(ParameterType_Group, "meas", "Measured image properties"); AddParameter(ParameterType_InputImage, "meas.in", "Measured image"); SetParameterDescription("meas.in", "Image used as measured in the comparison."); AddParameter(ParameterType_Int, "meas.channel", "Measured image channel"); SetParameterDescription("meas.channel", "Used channel for the measured image."); SetDefaultParameterInt("meas.channel", 1); SetMinimumParameterIntValue("meas.channel", 1); AddParameter(ParameterType_Group, "roi", "Region Of Interest (relative to reference image)"); AddParameter(ParameterType_Int, "roi.startx", "Start X"); SetDefaultParameterInt("roi.startx", 0); SetMinimumParameterIntValue("roi.startx", 0); SetParameterDescription("roi.startx", "ROI start x position."); AddParameter(ParameterType_Int, "roi.starty", "Start Y"); SetDefaultParameterInt("roi.starty", 0); SetMinimumParameterIntValue("roi.starty", 0); SetParameterDescription("roi.starty", "ROI start y position."); AddParameter(ParameterType_Int, "roi.sizex", "Size X"); SetDefaultParameterInt("roi.sizex", 0); SetMinimumParameterIntValue("roi.sizex", 1); SetParameterDescription("roi.sizex","Size along x in pixels."); AddParameter(ParameterType_Int, "roi.sizey", "Size Y"); SetDefaultParameterInt("roi.sizey", 0); SetMinimumParameterIntValue("roi.sizey", 1); SetParameterDescription("roi.sizey","Size along y in pixels."); AddParameter(ParameterType_Float, "mse", "MSE"); SetParameterDescription("mse", "Mean Squared Error value."); SetParameterRole("mse", Role_Output ); AddParameter(ParameterType_Float, "mae", "MAE"); SetParameterDescription("mae", "Mean Absolute Error value."); SetParameterRole("mae", Role_Output ); AddParameter(ParameterType_Float, "psnr", "PSNR"); SetParameterDescription("psnr", "Peak Signal to Noise Ratio value."); SetParameterRole("psnr", Role_Output); AddParameter(ParameterType_Float, "count", "count"); SetParameterDescription("count", "Nb of pixels which are different."); SetParameterRole("count", Role_Output); AddRAMParameter(); // Doc example parameter settings SetDocExampleParameterValue("ref.in", "GomaApres.png"); SetDocExampleParameterValue("ref.channel", "1"); SetDocExampleParameterValue("meas.in", "GomaAvant.png"); SetDocExampleParameterValue("meas.channel", "2"); SetDocExampleParameterValue("roi.startx", "20"); SetDocExampleParameterValue("roi.starty", "30"); SetDocExampleParameterValue("roi.sizex", "150"); SetDocExampleParameterValue("roi.sizey", "200"); SetOfficialDocLink(); } void DoUpdateParameters() override { // Set channel interval if( HasValue("ref.in") )
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
{ SetMaximumParameterIntValue("ref.channel", this->GetParameterImage("ref.in")->GetNumberOfComponentsPerPixel()); } if( HasValue("meas.in") ) { SetMaximumParameterIntValue("meas.channel", this->GetParameterImage("meas.in")->GetNumberOfComponentsPerPixel()); } // ROI if ( HasValue("ref.in") ) { FloatVectorImageType::RegionType largestRegion = this->GetParameterImage("ref.in")->GetLargestPossibleRegion(); // Put the limit of the index and the size relative the image SetMinimumParameterIntValue("roi.sizex", 1); SetMaximumParameterIntValue("roi.sizex", largestRegion.GetSize(0)); SetMinimumParameterIntValue("roi.sizey", 1); SetMaximumParameterIntValue("roi.sizey", largestRegion.GetSize(1)); SetMinimumParameterIntValue("roi.startx", 0); SetMaximumParameterIntValue("roi.startx", largestRegion.GetSize(0) - 1); SetMinimumParameterIntValue("roi.starty", 0); SetMaximumParameterIntValue("roi.starty", largestRegion.GetSize(1) - 1); } } void DoExecute() override { // Init filters ExtractROIMonoFilterType::Pointer extractRefFilter = ExtractROIMonoFilterType::New(); ExtractROIMonoFilterType::Pointer extractMeasFilter = ExtractROIMonoFilterType::New(); StreamingCompareImageFilterType::Pointer compareFilter = StreamingCompareImageFilterType::New(); // Get input image pointers FloatVectorImageType::Pointer refIm = this->GetParameterImage("ref.in"); FloatVectorImageType::Pointer measIm = this->GetParameterImage("meas.in"); // Get the region of interest FloatVectorImageType::RegionType region; region.SetIndex(0, GetParameterInt("roi.startx")); region.SetIndex(1, GetParameterInt("roi.starty")); region.SetSize(0, GetParameterInt("roi.sizex")); region.SetSize(1, GetParameterInt("roi.sizey")); if (region.GetNumberOfPixels() == 0) { otbAppLogINFO( << "Using whole reference image since the ROI contains no pixels or is not specified" ); region = GetParameterImage("ref.in")->GetLargestPossibleRegion(); } otbAppLogDEBUG( << "Region of interest used for comparison : " << region ); if( !region.Crop(refIm->GetLargestPossibleRegion()) || !region.Crop(measIm->GetLargestPossibleRegion()) ) { otbAppLogFATAL( << "ROI is not contained in the images regions"); } extractRefFilter->SetInput( refIm ); extractMeasFilter->SetInput( measIm ); extractRefFilter->SetExtractionRegion(region); extractMeasFilter->SetExtractionRegion(region);