Hi,
We try to compute the image's PSNR(Peak Signal to Noise Ratio) after 
MedianImageFilter and BilateralImageFilter .In
circulation, we wanted to keep the image pointer, but failed.
 
OutputImageType* rescaleoutputImage;
OutputImageType* outputImage;
for( i=4;i<10;i++){
   for( j=4;j<10;j++)
 {
    radius[0]=i;
    radius[1]=j;
   ReaderType::Pointer reader = ReaderType::New(); //Instance reader
   reader->SetFileName(noisedFile.c_str() );

  mFilterType::Pointer medianFilter = mFilterType::New();//Instance 
itk::MedianImageFilter
  medianFilter->SetRadius(radius);
  medianFilter->SetInput( reader->GetOutput() );
 OutputImageType* mediaoutput=medianFilter->GetOutput();
 
     WriterType::Pointer mediawriter= WriterType::New();//Instance writer
    mediawriter->SetFileName( "temporaryoutput.tif");
   mediawriter->SetInput(mediaoutput);
  mediawriter->Update();         //update
  
  computePSNR->ComputeMSE(mediaoutput);  //Custom function to compute PSNR
  float roundmediaPSNR=computePSNR->PSNR();

    ReaderType::Pointer Bilateralreader = ReaderType::New(); //Instance reader 
  Bilateralreader->SetFileName("temporaryoutput.tif");
 
   FilterType::Pointer filter = FilterType::New();//Instance 
itk::BilateralImageFilter
  filter->SetInput(Bilateralreader->GetOutput() );

  const unsigned int Dimension = InputImageType::ImageDimension;// setting 
parameters for BilateralImageFilter
  double domainSigmas[ Dimension ];
  for(unsigned int ii=0; ii<Dimension; ii++)
    {
      domainSigmas[ii] = i;
    }
  const double rangeSigma = j;
    filter->SetDomainSigma( domainSigmas );
  filter->SetRangeSigma(  rangeSigma   );

    typedef itk::RescaleIntensityImageFilter<
               OutputImageType, WriteImageType > RescaleFilterType;
  RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
  rescaler->SetOutputMinimum(   0 );
  rescaler->SetOutputMaximum( 255 );
  
    rescaler->SetInput( filter->GetOutput() );
  rescaleoutputImage=rescaler->GetOutput();
   rescaler->Update();  //update
 
   computePSNR->ComputeMSE(rescaleoutputImage);// computer PSNR after 
MedianImageFilter and BilateralImageFilter
  float roundPSNR=computePSNR->PSNR();
  if(roundPSNR>psnr)  // if the value of PSNR is greater than last turn
  {
     mediapsnr=roundmediaPSNR;
  psnr=roundPSNR;
     radiusi=radius[0];
     radiusj=radius[1];
  BilateraldomainSigma=domainSigmas[0];
     BilateralrangeSigma=rangeSigma;
     outputImage=rescaleoutputImage; //keep the image's pointer
    }
   }
}//for

 writer = WriterType::New();
 writer->SetFileName("outputImage.tif" );
 writer->SetInput(outputImage); //outputImage is NULL
 writer->Update();
 

 If no circulation, it work well. Debug it, we found outputImage is NULL in the 
writer. We were surprised that in each round of circulation the 
pointer(outputImage, which point an image ) is released. How can we keep the 
image pointer?

Thanks.
XiongXiang Zhang


 
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers

Reply via email to