#include <ICLCore/Img.h>
#include <ICLUtils/Random.h>
#include <ICLQt/Quick.h>
#include <ICLFilter/UnaryCompareOp.h>
#include <ICLFilter/MedianOp.h>
#include <ICLFilter/ConvolutionOp.h>

using namespace icl;
using namespace icl::utils;

// custom filter
struct NormRangeOp : public UnaryOp{
  virtual void apply(const ImgBase *src, ImgBase **dst){
    src->deepCopy(dst);
    (*dst)->normalizeAllChannels(Range64f(0,255));
  }
};

int main(){
  // demo image
  core::Img32f image = create("lena");
  
  // median filter
  filter::MedianOp med(Size(5,5));
  
  // laplace filter
  filter::ConvolutionOp lap(ConvolutionKernel::laplace5x5);

  // sobel filter
  filter::ConvolutionOp sob(ConvolutionKernel::sobelX5x5);

  // custom operator (normalize range to [0,255])
  NormRangeOp nor;

  // nested call, identical to 
  // *nor.apply(lab.apply(sob.apply(med.apply(image))));
  const ImgBase &result = nor(lap(sob(med(image))));
  
  // show the image
  show(result);
}