[Insight-users] Problem when collapsing a dimension in
itkExtractImageFilter
Didier Rajon
didier at ufl.edu
Mon Sep 5 16:11:09 EDT 2005
Hi
I'm having a problem with itkExtractImageFilter. When I try to extract a
2D slice from a 3D image dataset, the slice seems to be extracted
correctly, but the spacing of the first dimension of the slice is always 0.
I just switched from ITK 2.0 to ITK 2.2 and the problem only happens
with ITK 2.2, never with ITK 2.0.
I'm using ITK on redhat linux 9.0.
I attached a little C++ program to show the problem. The program reads
a 3D image from a file, display the spacing of the image, extract a
slice perpendicular to the 3rd dimension, and display the spacing of the
slice.
If I compile the program with ITK 2.0 and execute the program, I get the
following result:
Executing program ExtractSlice.
Input file name: My3DImage.vtk.
Slice no: 15.
Reading input image.
Execution terminated successfully.
Input spacing: [2, 2, 2]
Extracting slice no 15.
Execution terminated successfully.
Slice spacing: [2, 2]
If I compile the program with ITK 2.2 and execute the program I get the
following result:
Executing program ExtractSlice.
Input file name: My3DImage.vtk.
Slice no: 15.
Reading input image.
Execution terminated successfully.
Input spacing: [2, 2, 2]
Extracting slice no 15.
Execution terminated successfully.
Slice spacing: [0, 2]
The first dimension of the slice has been set to 0 by the filter.
Note that if I don't collapse the dimension (by setting the size of the
extraction region to [Nx, Ny, 1] instead of [Nx, Ny, 0] and setting the
filter output type to a 3D image), I get the correct spacing: [2, 2,
2]. This problem seems to occur only if I try to collapse a dimension.
Is there anything that has changed with ITK 2.2 and that I should
incorporate to my program in order to get the correct spacing?
Thanks for helping me solving this problem.
Didier.
--
Didier Rajon
Department of Neurological Surgery
University of Florida
MBI, L2100 PO Box 100265
Gainesville, FL, 32610-0265
Tel: (352) 294 0144
Fax: (352) 392 8413
-------------- next part --------------
// system include files
#include <string>
// itk include files
#include "itkImageFileReader.h"
#include "itkExtractImageFilter.h"
// local include files.
main (int argc, char **argv)
{
// 0) To get and check the program arguments.
/////////////////////////////////////////////
std::string inputFileName;
int sliceNo;
{
// To check the command line
if ( argc != 3 )
{
std::cerr << "Error: bad command-line. Try again with command-line:" << std::endl;
std::cerr << "ExtractSlice InputFileName SliceNo" << std::endl;
std::cerr << " - InputFileName: The full path name of the file that contains the input image." << std::endl;
std::cerr << " - SliceNo: The slice to be extracted." << std::endl;
std::cerr << "ex: ExtractSlice ./LowResolution.vtk 12" << std::endl;
exit(0);
}
// To get the arguments.
inputFileName = argv[1];
sliceNo = atoi(argv[2]);
std::cout << std::endl << "Executing program ExtractSlice." << std::endl;
std::cout << "Input file name: " << inputFileName << "." << std::endl;
std::cout << "Slice no: " << sliceNo << "." << std::endl;
std::cout << std::endl;
}
// 1) To define the image type.
///////////////////////////////
const unsigned int ImageDimension = 3;
const unsigned int SliceDimension = 2;
typedef unsigned short VoxelType;
typedef itk::Image<VoxelType, ImageDimension> ImageType;
typedef itk::Image<VoxelType, SliceDimension> SliceType;
// 2) To read the input image.
//////////////////////////////
ImageType::Pointer inputImage;
{
std::cout << "Reading input image." << std::endl;
typedef itk::ImageFileReader<ImageType> ReaderType;
ReaderType::Pointer imageReader = ReaderType::New();
imageReader->SetFileName(inputFileName.c_str());
try {
imageReader->Update();
std::cout << "Execution terminated successfully." << std::endl;
}
catch(itk::ExceptionObject & err) {
std::cerr << err << std::endl;
exit(0);
}
inputImage = imageReader->GetOutput();
}
std::cout << "Input spacing: " << inputImage->GetSpacing() << std::endl;
// 3) To extract the slice.
///////////////////////////
SliceType::Pointer extractedSlice;
{
std::cout << "Extracting slice no " << sliceNo << "." << std::endl;
typedef itk::ExtractImageFilter<ImageType, SliceType> FilterType;
FilterType::Pointer sliceExtractor = FilterType::New();
sliceExtractor->SetInput(inputImage);
ImageType::RegionType extractionRegion = inputImage->GetLargestPossibleRegion();
ImageType::SizeType extractionSize = extractionRegion.GetSize();
ImageType::IndexType extractionIndex = extractionRegion.GetIndex();
extractionSize[2] = 0;
extractionIndex[2] = sliceNo;
extractionRegion.SetSize(extractionSize);
extractionRegion.SetIndex(extractionIndex);
sliceExtractor->SetExtractionRegion(extractionRegion);
try {
sliceExtractor->Update();
std::cout << "Execution terminated successfully."
<< std::endl;
}
catch(itk::ExceptionObject & err) {
std::cerr << err << std::endl;
exit(0);
}
extractedSlice = sliceExtractor->GetOutput();
}
std::cout << "Slice spacing: " << extractedSlice->GetSpacing() << std::endl;
}
More information about the Insight-users
mailing list