[Insight-users] Importing median filter output from ITK to VTK

Madhusudhanan Balasubramanian madhu_lsu at yahoo.com
Sat Nov 13 19:13:44 EST 2004


Hi Luis/all,
 
Here is the updated median filter routine that receives an input buffer and applies median filter (ITK) and imports the filtered image to VTK.  The problem I had with the earlier routine was with ShallowCopy (so obvious); the imageToVTKFilter output (which is vtkImageData *) is destroyed after returning from the routine, while ShallowCopy maintains the earlier reference; so I replaced with DeepCopy and it worked.
 
Thanks for your help Luis/all.
 
Madhu.

New routine:
//Apply median filter to the input buffer
void medianOnBuffer(unsigned char *userBuffer, int imgWidth, int imgHeight, vtkImageData* medianImage){
 int *dimensions;
 dimensions = new int[2];
 dimensions[0] = imgWidth;
 dimensions[1] = imgHeight;
 typedef unsigned char pixelType;
 typedef itk::Image<pixelType, 2> imageType;
 
 //////////////////////////////////
 //Import the input buffer into ITK
 typedef itk::ImportImageFilter<pixelType, 2> importFilterType;
 importFilterType::Pointer importFilter = importFilterType::New();
 importFilterType::SizeType size;
 size[0] = imgWidth;  //x-axis
 size[1] = imgHeight; //y-axis
 importFilterType::IndexType start;
 start.Fill(0);
 importFilterType::RegionType region;
 region.SetIndex(start);
 region.SetSize(size);
 importFilter->SetRegion(region);
 double origin[2];
 origin[0] = 0.0;
 origin[1] = 0.0;
 importFilter->SetOrigin(origin);
 double spacing[2];
 spacing[0] = 1.0;
 spacing[1] = 1.0;
 importFilter->SetSpacing(spacing);
 const bool importImageFilterWillOwnTheBuffer = false;
 importFilter->SetImportPointer(userBuffer, imgWidth*imgHeight, importImageFilterWillOwnTheBuffer);
 importFilter->Update();
 
 //////////////////////////////////
 //Apply median filter to the image
 typedef itk::Image<pixelType, 2> InputImageType;
 typedef itk::Image<pixelType, 2> OutputImageType;
 typedef itk::MedianImageFilter<InputImageType, OutputImageType> filterType;
 filterType::Pointer filter = filterType::New();
 //Define filter boundaries
 InputImageType::SizeType indexRadius;
 indexRadius[0] = 1;
 indexRadius[1] = 1;
 filter->SetRadius(indexRadius);
 filter->SetInput(importFilter->GetOutput());
 filter->Update();
 
 /////////////////////////////////////////////
 //Import the filtered image to VTK (from ITK)
 typedef itk::ImageToVTKImageFilter<OutputImageType> connectorType;
 connectorType::Pointer connector = connectorType::New();
 connector->SetInput(filter->GetOutput());
 connector->Update();
 //Copy the output
 medianImage->DeepCopy(connector->GetImporter()->GetOutput());
 medianImage->Update();
}

Luis Ibanez <luis.ibanez at kitware.com> wrote:

Hi Madhusudhanan,

>From your email,
It seems that the code is now working fine for you...
is that right ?


Could you please describe the problems that you found
when you were:

"initializing some values earlier in the pipeline."



Thanks


Luis



------------------------------------
Madhusudhanan Balasubramanian wrote:

> Hi Luis / all,
> 
> The routine I posted for interfacing the ITK output (output from median 
> filter) with VTK works just fine. I had problem in initializing some 
> values earlier in the pipeline. Thought I'll let you know.
> 
> Madhu.
> 
> */Luis Ibanez /* wrote:
> 
> 
> Hi Madhusudhanan,
> 
> Please write to a file the output of the input filter
> in order to verify if the ITK image created form your
> buffer is correct. Just connect an ImageFileWriter at
> the output of the Importer.
> 
> That will help to identify if the problem is related
> to your local buffer or to the convertion between ITK
> and VTK images.
> 
> Please let us know what you find.
> 
> 
> Thanks
> 
> 
> Luis
> 
> 
> ----------------------------------------
> Madhusudhanan Balasubramanian wrote:
> 
> > Hi all,
> >
> > I wrote a small routine that applied median filter (ITK) on an input
> > buffer (unsigned char *) and imports the filter output to VTK.
> > Initially, when I returned the vtkImageData * output from
> > 'ImageToVTKImageFilter', I had problem accessing the data (memory
> > exception). So I decided to ! copy the data into a separate
> buffer before
> > returning from the routine. However the result is just some noisy
> image
> > (nowhere close to the input image). I am herewith attaching the
> routine
> > that I wrote. I appreciate if anyone has any inputs on this.
> >
> > Thanks,
> > Madhu.
> >
> > //Apply median filter to the input buffer
> > void medianOnBuffer(unsigned char *userBuffer, int imgWidth, int
> > imgHeight, vtkImageData* medianImage, unsigned char *outputImageUSC){
> >
> > int *dimensions;
> > dimensions = new int[2];
> > dimensions[0] = imgWidth;
> > dimensions[1] = imgHeight;
> >
> > typedef unsigned char pixelType;
> > typedef itk::Image imageType;
> > typedef itk::ImportImageFilter importFilterType;
> > importFilterType::Pointer importFilter = importFilterType::New();
> > importFilterType::SizeType size;
> > size[0] = imgWidth; //x-axis
> > s! ize[1] = imgHeight; //y-axis
> > importFilterType::IndexType start;
> > start.Fill(0);
> > importFilterType::RegionType region;
> > region.SetIndex(start);
> > region.SetSize(size);
> > importFilter->SetRegion(region);
> > double origin[2];
> > origin[0] = 0.0;
> > origin[1] = 0.0;
> > importFilter->SetOrigin(origin);
> > double spacing[2];
> > spacing[0] = 1.0;
> > spacing[1] = 1.0;
> > importFilter->SetSpacing(spacing);
> > //
> > const bool importImageFilterWillOwnTheBuffer = false;
> > importFilter->SetImportPointer(userBuffer, imgWidth*imgHeight,
> > importImageFilterWillOwnTheBuffer);
> > importFilter->Update();
> > //Apply median filter to the image
> > typedef itk::Image InputImageType;
> > typedef itk::Image OutputImageType;
> > typedef itk::MedianImageFilter filterType;
> > filterType::Pointer filter = filterType::New();
> > //Define filter boundaries
> > InputImageType::SizeType indexRadius;
> > indexRadius[0] = 1;
> > indexRadius[1] = 1;
> > filter->SetRadius(indexRadius);
> > filter->SetInput(importFilter->GetOutput());
> > filter->Update();
> > //Import the filtered image to VTK
> > typedef itk::ImageToVTKImageFilter connectorType;
> > connectorType::Pointer connector = connectorType::New();
> > connector->SetInput(filter->GetOutput());
> > connector->Update();
> > //Copy the output
> > medianImage->ShallowCopy(connector->GetOutput());
> > medianImage->Update();
> > //Validate the imported image
> > unsigned char *testBuffer = (unsigned char
> > *)medianImage->GetScalarPointer();
> >
> > //copy result to outputImageUSC
> > int i, j;
> > for (i = 0; i < dimensions[1]; i++)
> > for (j = 0; j < dimensions[0]; j++)
> > outputImageUSC[i * dimensions[0] + j] = testBuffer[i * dimensions[0]
> > + j];
> > }
> >
> 
> 
> 
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
> 






__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20041113/16696554/attachment.htm


More information about the Insight-users mailing list