[Insight-users] Segmented volume scaling problem, why its working with 2D and not with 3D?
Bill Lorensen
bill.lorensen at gmail.com
Tue Oct 6 12:08:40 EDT 2009
I suspect that your size calculation is incorrect.
Attached is a program that will resample a meta volume. (Note it uses a
LinearInterpolateImageFunction. You should change this to a nearest neighbor
interpolator).
You can see how I calculate the size.
Bill
On Tue, Oct 6, 2009 at 10:09 AM, Juliette Deniau
<juliette.deniau at yahoo.fr>wrote:
> Dear Luis and Itk users,
>
> I’m trying to scale a segmented volume (obtained by confidence connected
> filter)using itkAffineTransform but the result volume has information only
> in one slide. When I use the original volume instead of the segmented one,
> the results are fine.
>
> I applied the same code to 2D image ( segmented image using confidence
> connected filter)and the original image, the results are fine for both of
> them.
>
> What I cannot understand is why this is working for 2D original image, 2D
> segmented image, the original volume and not for the 3D segmented volume ?
>
> I attach both codes that I use for my test(2D and 3D cases)
>
> Thank you
>
> Juliette
>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> 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-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20091006/5b16fb7c/attachment.htm>
-------------- next part --------------
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: MetaResample.cxx,v $
Language: C++
Date: $Date: 2005/11/19 16:31:50 $
Version: $Revision: 1.9 $
Copyright (c) Insight Software 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
// Resample a Meta series
// Usage: MetaResample InputDirectory OutputDirectory
// xSpacing ySpacing zSpacing
//
// Example: MetaResample CT CTResample 0 0 1.5
// will read a series from the CT directory and create a
// new series in the CTResample directory. The new series
// will have the same x,y spacing as the input series, but
// will have a z-spacing of 1.5.
//
// Description:
// MetaResample resamples a meta series with user-specified
// spacing. The number of slices in
// the output series may be larger or smaller due to changes in the
// z-spacing. To retain the spacing for a given dimension, specify 0.
//
// The program progresses as follows:
// 1) Read the input series
// 2) Resample the series according to the user specified x-y-z
// spacing.
// 3) Write the new series
//
#include "itkVersion.h"
#include "itkOrientedImage.h"
#include "itkMinimumMaximumImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkResampleImageFilter.h"
#include "itkIdentityTransform.h"
#include "itkLinearInterpolateImageFunction.h"
#include <string>
int main( int argc, char* argv[] )
{
if( argc < 4 )
{
std::cerr << "Usage: "
<< argv[0]
<< " InputMetaFile OutputMetaFile spacing_z"
<< std::endl;
return EXIT_FAILURE;
}
const unsigned int InputDimension = 3;
const unsigned int OutputDimension = 3;
typedef signed short PixelType;
typedef itk::OrientedImage< PixelType, InputDimension >
InputImageType;
typedef itk::OrientedImage< PixelType, OutputDimension >
OutputImageType;
typedef itk::ImageFileReader< InputImageType >
ReaderType;
typedef itk::IdentityTransform< double, InputDimension >
TransformType;
typedef itk::LinearInterpolateImageFunction< InputImageType, double >
InterpolatorType;
typedef itk::ResampleImageFilter< InputImageType, InputImageType >
ResampleFilterType;
typedef itk::ImageFileWriter< OutputImageType >
FileWriterType;
////////////////////////////////////////////////
// 1) Read the input series
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( argv[1] );
try
{
reader->Update();
}
catch (itk::ExceptionObject &excp)
{
std::cerr << "Exception thrown while reading the input file" << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
////////////////////////////////////////////////
// 2) Resample the series
InterpolatorType::Pointer interpolator = InterpolatorType::New();
TransformType::Pointer transform = TransformType::New();
transform->SetIdentity();
const InputImageType::SpacingType& inputSpacing =
reader->GetOutput()->GetSpacing();
const InputImageType::RegionType& inputRegion =
reader->GetOutput()->GetLargestPossibleRegion();
const InputImageType::SizeType& inputSize =
inputRegion.GetSize();
// Compute the size of the output. The user specifies a spacing on
// the command line. If the spacing is 0, the input spacing will be
// used. The size (# of pixels) in the output is recomputed using
// the ratio of the input and output sizes.
InputImageType::SpacingType outputSpacing;
outputSpacing[0] = 0,0;
outputSpacing[1] = 0.0;
outputSpacing[2] = atof(argv[3]);
for (unsigned int i = 0; i < 3; i++)
{
if (outputSpacing[i] == 0.0)
{
outputSpacing[i] = inputSpacing[i];
}
}
InputImageType::SizeType outputSize;
typedef InputImageType::SizeType::SizeValueType SizeValueType;
outputSize[0] = static_cast<SizeValueType>(inputSize[0] * inputSpacing[0] / outputSpacing[0] + .5);
outputSize[1] = static_cast<SizeValueType>(inputSize[1] * inputSpacing[1] / outputSpacing[1] + .5);
outputSize[2] = static_cast<SizeValueType>(inputSize[2] * inputSpacing[2] / outputSpacing[2] + .5);
ResampleFilterType::Pointer resampler = ResampleFilterType::New();
resampler->SetInput( reader->GetOutput() );
resampler->SetTransform( transform );
resampler->SetInterpolator( interpolator );
resampler->SetOutputOrigin ( reader->GetOutput()->GetOrigin());
resampler->SetOutputSpacing ( outputSpacing );
resampler->SetOutputDirection ( reader->GetOutput()->GetDirection());
resampler->SetSize ( outputSize );
resampler->Update ();
////////////////////////////////////////////////
// 5) Write the new series
FileWriterType::Pointer seriesWriter = FileWriterType::New();
seriesWriter->SetInput( resampler->GetOutput() );
seriesWriter->SetFileName( argv[2] );
try
{
seriesWriter->Update();
}
catch( itk::ExceptionObject & excp )
{
std::cerr << "Exception thrown while writing the series " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
More information about the Insight-users
mailing list