<commit_before>/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    itkNarrowBandThresholdSegmentationLevelSetImageFilterTest.cxx
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Insight Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include "itkNarrowBandThresholdSegmentationLevelSetImageFilter.h"
//#include "itkImageFileWriter.h"
//#include "itkRawImageIO.h"
#include "itkCastImageFilter.h"
#include "itkCommand.h"
#include "itkEventObject.h"

namespace NBTS {

 typedef itk::Image<float, 3> ImageType;
typedef itk::Image<char, 3> SeedImageType;

const int V_WIDTH  = 64;
const int V_HEIGHT = 64;
const int V_DEPTH  = 64;

float sphere(float x, float y, float z)
{
    float dis;
    dis = (x - (float)V_WIDTH/2.0)*(x - (float)V_WIDTH/2.0)
      /((0.2f*V_WIDTH)*(0.2f*V_WIDTH)) + 
      (y - (float)V_HEIGHT/2.0)*(y - (float)V_HEIGHT/2.0)
      /((0.2f*V_HEIGHT)*(0.2f*V_HEIGHT)) + 
      (z - (float)V_DEPTH/2.0)*(z - (float)V_DEPTH/2.0)
      /((0.2f*V_DEPTH)*(0.2f*V_DEPTH));
    return(1.0f-dis);
}

void evaluate_function(itk::Image<char, 3> *im,
          float (*f)(float, float, float) )
{
  itk::Image<char, 3>::IndexType idx;

  for(int z = 0; z < V_DEPTH; ++z)
    {
      idx[2] = z;
      for (int y = 0; y < V_HEIGHT; ++y)
        {
          idx[1] = y;
          for (int x = 0; x < V_WIDTH; ++x)
            {
              idx[0] = x;
              if ( f((float)x,(float)y,(float)z) >= 0.0 )
                {  im->SetPixel(idx, 1 ); }
              else
                {  im->SetPixel(idx, 0 ); }
            }
        }
    }
}

} // end namespace


namespace itk {

class RMSCommand : public Command
{
public:
  /** Smart pointer declaration methods */
  typedef RMSCommand Self;
  typedef Command Superclass;
  typedef itk::SmartPointer<Self>  Pointer;
  typedef itk::SmartPointer<const Self>  ConstPointer;
  itkTypeMacro( RMSCommand, Command );
  itkNewMacro(Self);

  /** Standard Command virtual methods */
  void Execute(Object *caller, const EventObject &)
  {
    //std::cout <<
      //(dynamic_cast<SparseFieldLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType> *>(caller))->GetRMSChange()
      //        << std::endl;
    std::cout <<
      (dynamic_cast<NarrowBandLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType> *>(caller))->GetSegmentationFunction()->GetPropagationWeight()
              << std::endl;
   
  }
  void Execute(const Object *, const EventObject &)
  {
    std::cout << "ack" << std::endl;

  }

protected:
  RMSCommand()  {}
  virtual ~RMSCommand() {}
};

}


int itkNarrowBandThresholdSegmentationLevelSetImageFilterTest(int, char * [] )
{
  std::cout << "Last modified 11/08/02" << std::endl;
  
  NBTS::ImageType::RegionType reg;
  NBTS::ImageType::RegionType::SizeType sz;
  NBTS::ImageType::RegionType::IndexType idx;
  idx[0] = idx[1] = idx[2] = 0;
  sz[0] = sz[1] = sz[2] = 64;
  reg.SetSize(sz);
  reg.SetIndex(idx);

  NBTS::ImageType::Pointer     inputImage = NBTS::ImageType::New();
  NBTS::SeedImageType::Pointer seedImage = NBTS::SeedImageType::New();
  inputImage->SetRegions(reg);
  seedImage->SetRegions(reg);
  inputImage->Allocate();
  seedImage->Allocate();

  // Starting surface is a sphere in the center of the image.
  NBTS::evaluate_function(seedImage, NBTS::sphere);

  // Target surface is a diamond
  float val;
  unsigned int i;
  //  NBTS::ImageType::IndexType idx;
  for (idx[2] = 0; idx[2] < 64; idx[2]++)
    for (idx[1] = 0; idx[1] < 64; idx[1]++)
        for (idx[0] = 0; idx[0] < 64; idx[0]++)
          {
            val = 0;
            for (i = 0; i < 3; ++i)
              {
                if (idx[i] < 32) val+=idx[i];
                else val += 64 - idx[i];
              }
            inputImage->SetPixel(idx, val);
          }

  itk::NarrowBandThresholdSegmentationLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType>::Pointer
    filter = itk::NarrowBandThresholdSegmentationLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType>::New();
  filter->SetInput(seedImage);
  filter->SetFeatureImage(inputImage);

  filter->SetUpperThreshold(63);
  filter->SetLowerThreshold(50);

  filter->SetMaximumRMSError(0.04); //Does not have any effect
  filter->SetMaximumIterations(10);
  filter->ReverseExpansionDirectionOn(); // Change the default behavior of the speed
                                      // function so that negative values result in
                                      // surface growth.
  
  itk::RMSCommand::Pointer c = itk::RMSCommand::New();
  filter->AddObserver(itk::IterationEvent(), c); 
  filter->SetIsoSurfaceValue(0.5);  //<--- IMPORTANT!  Default is zero.
  
  try {
    filter->Update();
    std::cout << "Done first trial" << std::endl;
    // Repeat to make sure that the filter is reinitialized properly
    filter->SetMaximumIterations(8);
    filter->Update();
    std::cout << "Done second trial" << std::endl;
    
    //For Debugging
    //typedef itk::ImageFileWriter< ::NBTS::ImageType> WriterType;
    //WriterType::Pointer writer = WriterType::New();
    //writer->SetInput( filter->GetOutput() );
    //writer->SetFileName( "outputThreshold.mhd" );
    //writer->Write();
    
    //WriterType::Pointer writer3 = WriterType::New();
    //writer3->SetInput(inputImage);
    //writer3->SetFileName("inputThreshold.mhd");
    //writer3->Write();
    
    // typedef itk::ImageFileWriter< ::NBTS::SeedImageType> Writer2Type;
    //Writer2Type::Pointer writer2 = Writer2Type::New();
    //writer2->SetInput(seedImage);
    //writer2->SetFileName("seedThreshold.mhd");
    //writer2->Write();<commit_msg>BUG: Command object declared with same name as command object in another test.<commit_after>/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    itkNarrowBandThresholdSegmentationLevelSetImageFilterTest.cxx
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Insight Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include "itkNarrowBandThresholdSegmentationLevelSetImageFilter.h"
//#include "itkImageFileWriter.h"
//#include "itkRawImageIO.h"
#include "itkCastImageFilter.h"
#include "itkCommand.h"
#include "itkEventObject.h"

namespace NBTS {

 typedef itk::Image<float, 3> ImageType;
typedef itk::Image<char, 3> SeedImageType;

const int V_WIDTH  = 64;
const int V_HEIGHT = 64;
const int V_DEPTH  = 64;

float sphere(float x, float y, float z)
{
    float dis;
    dis = (x - (float)V_WIDTH/2.0)*(x - (float)V_WIDTH/2.0)
      /((0.2f*V_WIDTH)*(0.2f*V_WIDTH)) + 
      (y - (float)V_HEIGHT/2.0)*(y - (float)V_HEIGHT/2.0)
      /((0.2f*V_HEIGHT)*(0.2f*V_HEIGHT)) + 
      (z - (float)V_DEPTH/2.0)*(z - (float)V_DEPTH/2.0)
      /((0.2f*V_DEPTH)*(0.2f*V_DEPTH));
    return(1.0f-dis);
}

void evaluate_function(itk::Image<char, 3> *im,
          float (*f)(float, float, float) )
{
  itk::Image<char, 3>::IndexType idx;

  for(int z = 0; z < V_DEPTH; ++z)
    {
      idx[2] = z;
      for (int y = 0; y < V_HEIGHT; ++y)
        {
          idx[1] = y;
          for (int x = 0; x < V_WIDTH; ++x)
            {
              idx[0] = x;
              if ( f((float)x,(float)y,(float)z) >= 0.0 )
                {  im->SetPixel(idx, 1 ); }
              else
                {  im->SetPixel(idx, 0 ); }
            }
        }
    }
}

} // end namespace


namespace itk {

class NBRMSCommand : public Command
{
public:
  /** Smart pointer declaration methods */
  typedef NBRMSCommand Self;
  typedef Command Superclass;
  typedef itk::SmartPointer<Self>  Pointer;
  typedef itk::SmartPointer<const Self>  ConstPointer;
  itkTypeMacro( NBRMSCommand, Command );
  itkNewMacro(Self);

  /** Standard Command virtual methods */
  void Execute(Object *caller, const EventObject &)
  {
    std::cout <<
      (dynamic_cast<NarrowBandLevelSetImageFilter< ::NBTS::SeedImageType,
       ::NBTS::ImageType> *>(caller))->GetSegmentationFunction()->GetPropagationWeight()
              << std::endl;
    
  }
  void Execute(const Object *, const EventObject &)
  {
    std::cout << "ack" << std::endl;

  }

protected:
  NBRMSCommand()  {}
  virtual ~NBRMSCommand() {}
};

}


int itkNarrowBandThresholdSegmentationLevelSetImageFilterTest(int, char * [] )
{
  NBTS::ImageType::RegionType reg;
  NBTS::ImageType::RegionType::SizeType sz;
  NBTS::ImageType::RegionType::IndexType idx;
  idx[0] = idx[1] = idx[2] = 0;
  sz[0] = sz[1] = sz[2] = 64;
  reg.SetSize(sz);
  reg.SetIndex(idx);

  NBTS::ImageType::Pointer     inputImage = NBTS::ImageType::New();
  NBTS::SeedImageType::Pointer seedImage = NBTS::SeedImageType::New();
  inputImage->SetRegions(reg);
  seedImage->SetRegions(reg);
  inputImage->Allocate();
  seedImage->Allocate();

  // Starting surface is a sphere in the center of the image.
  NBTS::evaluate_function(seedImage, NBTS::sphere);

  // Target surface is a diamond
  float val;
  unsigned int i;
  //  NBTS::ImageType::IndexType idx;
  for (idx[2] = 0; idx[2] < 64; idx[2]++)
    for (idx[1] = 0; idx[1] < 64; idx[1]++)
        for (idx[0] = 0; idx[0] < 64; idx[0]++)
          {
            val = 0;
            for (i = 0; i < 3; ++i)
              {
                if (idx[i] < 32) val+=idx[i];
                else val += 64 - idx[i];
              }
            inputImage->SetPixel(idx, val);
          }

  itk::NarrowBandThresholdSegmentationLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType>::Pointer
    filter = itk::NarrowBandThresholdSegmentationLevelSetImageFilter< ::NBTS::SeedImageType, ::NBTS::ImageType>::New();
  filter->SetInput(seedImage);
  filter->SetFeatureImage(inputImage);

  filter->SetUpperThreshold(63);
  filter->SetLowerThreshold(50);

  filter->SetMaximumRMSError(0.04); //Does not have any effect
  filter->SetMaximumIterations(10);
  filter->ReverseExpansionDirectionOn(); // Change the default behavior of the speed
                                      // function so that negative values result in
                                      // surface growth.
  
  itk::NBRMSCommand::Pointer c = itk::NBRMSCommand::New();
  filter->AddObserver(itk::IterationEvent(), c); 
  filter->SetIsoSurfaceValue(0.5);  //<--- IMPORTANT!  Default is zero.
  
  try {
    filter->Update();
    std::cout << "Done first trial" << std::endl;
    // Repeat to make sure that the filter is reinitialized properly
    filter->SetMaximumIterations(8);
    filter->Update();
    std::cout << "Done second trial" << std::endl;
    
    //For Debugging
    //typedef itk::ImageFileWriter< ::NBTS::ImageType> WriterType;
    //WriterType::Pointer writer = WriterType::New();
    //writer->SetInput( filter->GetOutput() );
    //writer->SetFileName( "outputThreshold.mhd" );
    //writer->Write();
    
    //WriterType::Pointer writer3 = WriterType::New();
    //writer3->SetInput(inputImage);
    //writer3->SetFileName("inputThreshold.mhd");
    //writer3->Write();
    
    // typedef itk::ImageFileWriter< ::NBTS::SeedImageType> Writer2Type;
    //Writer2Type::Pointer writer2 = Writer2Type::New();
    //writer2->SetInput(seedImage);
    //writer2->SetFileName("seedThreshold.mhd");
    //writer2->Write();
{'fraction_non_alphanumeric': 0.17364034001815631, 'fraction_numerical': 0.018816538747214655, 'mean_word_length': 3.145740677386247, 'pattern_counts': {'":': 0, '<': 87, '<?xml version=': 0, '>': 94, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3527220', 'n_tokens_mistral': 4214, 'n_tokens_neox': 3942, 'n_words': 844}