📄 itkvectorimagetest.cxx
字号:
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkVectorImageTest.cxx,v $
Language: C++
Date: $Date: 2007-01-26 23:43:03 $
Version: $Revision: 1.16 $
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
#include <iostream>
#include "itkVariableLengthVector.h"
#include "itkImage.h"
#include "itkVectorImage.h"
#include "itkFixedArray.h"
#include "itkTimeProbe.h"
#include "itkVectorImageToImageAdaptor.h"
#include "itkImageRegionConstIterator.h"
#include "itkImageRegionIterator.h"
#include "itkImageLinearConstIteratorWithIndex.h"
#include "itkImageLinearIteratorWithIndex.h"
#include "itkConstNeighborhoodIterator.h"
#include "itkConstShapedNeighborhoodIterator.h"
#include "itkShapedNeighborhoodIterator.h"
#include "itkNeighborhoodIterator.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkImageRegionConstIteratorWithIndex.h"
#include "itkImageFileWriter.h"
#include "itkImageFileReader.h"
// This test tests:
// VectorImage
// -----------
// - Iterators on the VectorImage,
// - Timing tests comparing itk::VectorImage to similar itk::Image using
// FixedArray and VariableLengthVector
// - IO support for VectorImage.
int itkVectorImageTest( int, char* argv[] )
{
bool failed = false;
const unsigned int VectorLength = 6;
const unsigned int Dimension = 3;
typedef float PixelType;
{
// Test 1.
//
// Create an Image of VariableLengthVector, FixedArray, VectorImage of length 6 and compare
// times.
//
// Three images.. for crude timing analysis.
typedef itk::Image< itk::VariableLengthVector< PixelType >, Dimension > VariableLengthVectorImageType;
typedef itk::Image< itk::FixedArray< PixelType, VectorLength >,
Dimension > FixedArrayImageType;
typedef itk::VectorImage< PixelType, Dimension > VectorImageType;
// Using image of VariableLengthVector< PixelType >
{
typedef itk::VariableLengthVector< PixelType > InternalPixelType;
itk::TimeProbe clock;
clock.Start();
VariableLengthVectorImageType::Pointer image = VariableLengthVectorImageType::New();
VariableLengthVectorImageType::IndexType start;
InternalPixelType f( VectorLength );
for( unsigned int i=0; i<VectorLength; i++ ) { f[i] = i; }
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z
VariableLengthVectorImageType::SizeType size;
size[0] = 50; // size along X
size[1] = 50; // size along Y
size[2] = 50; // size along Z
VariableLengthVectorImageType::RegionType region;
region.SetSize( size );
region.SetIndex( start );
image->SetRegions( region );
image->Allocate();
image->FillBuffer( f );
clock.Stop();
double timeTaken = clock.GetMeanTime();
std::cout << "Allocating an image of itk::VariableLengthVector of length " << VectorLength
<< " with image size " << size << " took " << timeTaken << " s." << std::endl;
// Const iterator over the image...
{
clock.Start();
typedef itk::ImageRegionConstIterator< VariableLengthVectorImageType > IteratorType;
IteratorType it( image, image->GetBufferedRegion() );
it.Begin();
while( !it.IsAtEnd() )
{
it.Get();
++it;
}
clock.Stop();
std::cout << "ConstIterator Get() over the entire image took : " <<
clock.GetMeanTime() << " s." << std::endl;
}
}
// Using image of FixedArray< PixelType, VectorLength >
{
itk::TimeProbe clock;
clock.Start();
typedef itk::FixedArray< PixelType, VectorLength > InternalPixelType;
FixedArrayImageType::Pointer image = FixedArrayImageType::New();
FixedArrayImageType::IndexType start;
InternalPixelType f;
for( unsigned int i=0; i<VectorLength; i++ ) { f[i] = i; }
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z
FixedArrayImageType::SizeType size;
size[0] = 50; // size along X
size[1] = 50; // size along Y
size[2] = 50; // size along Z
FixedArrayImageType::RegionType region;
region.SetSize( size );
region.SetIndex( start );
image->SetRegions( region );
image->Allocate();
image->FillBuffer( f );
clock.Stop();
double timeTaken = clock.GetMeanTime();
std::cout << "Allocating an image of itk::FixedArray of length " << VectorLength
<< " with image size " << size << " took " << timeTaken << " s." << std::endl;
{
// Test and compare times with iterators
//
// First set some pixel
for( unsigned int i=0; i<VectorLength; i++ ) { f[i] = i*0.1; }
FixedArrayImageType::IndexType idx;
idx[0]=4; idx[1]=4;idx[2]=12;
image->SetPixel( idx, f );
}
{
clock.Start();
typedef itk::ImageRegionConstIterator< FixedArrayImageType > IteratorType;
IteratorType it( image, image->GetBufferedRegion() );
it.Begin();
while( !it.IsAtEnd() )
{
it.Get();
++it;
}
clock.Stop();
std::cout << "ConstIterator Get() over the entire image took : " <<
clock.GetMeanTime() << " s." << std::endl;
}
}
// Using VectorImage< PixelType, Dimension >
{
itk::TimeProbe clock;
clock.Start();
VectorImageType::Pointer vectorImage = VectorImageType::New();
VectorImageType::IndexType start;
itk::VariableLengthVector< PixelType > f( VectorLength );
for( unsigned int i=0; i<VectorLength; i++ ) { f[i] = i; }
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z
VectorImageType::SizeType size;
size[0] = 50; // size along X
size[1] = 50; // size along Y
size[2] = 50; // size along Z
VectorImageType::RegionType region;
region.SetSize( size );
region.SetIndex( start );
vectorImage->SetVectorLength( VectorLength );
vectorImage->SetRegions( region );
vectorImage->Allocate();
vectorImage->FillBuffer( f );
clock.Stop();
double timeTaken = clock.GetMeanTime();
std::cout << "Allocating an image of itk::VectorImage with pixels length " << VectorLength
<< " with image size " << size << " took " << timeTaken << " s." << std::endl;
// Iterator tests on the vector image.
//
// Const iterator over the vector image...
{
clock.Start();
typedef itk::ImageRegionConstIterator< VectorImageType > IteratorType;
IteratorType it( vectorImage, vectorImage->GetBufferedRegion() );
it.Begin();
while( !it.IsAtEnd() )
{
it.Get();
++it;
}
clock.Stop();
std::cout << "ConstIterator Get() over the entire vectorImage took : " <<
clock.GetMeanTime() << " s." << std::endl;
}
std::cout << "---------------------------------------------------------------" << std::endl;
std::cout << "Testing VectorImageToImageAdaptor to extract a component from the vector image" << std::endl;
const unsigned int componentToExtract = 4;
typedef itk::VectorImageToImageAdaptor< PixelType, Dimension > AdaptorType;
AdaptorType::Pointer vectorImageToImageAdaptor = AdaptorType::New();
vectorImageToImageAdaptor->SetExtractComponentIndex( componentToExtract );
if( vectorImageToImageAdaptor->GetExtractComponentIndex() != componentToExtract )
{
std::cerr << "[FAILED]" << std::endl;
}
vectorImageToImageAdaptor->SetImage( vectorImage );
vectorImageToImageAdaptor->Update();
typedef itk::Image< PixelType , Dimension > AdaptedImageType;
AdaptedImageType::IndexType index;
index[0]=10;
index[1]=10;
index[2]=10;
if( (vectorImageToImageAdaptor->GetPixel(index) != vectorImage->GetPixel( index )[componentToExtract])
|| (vectorImage->GetPixel( index )[componentToExtract] != componentToExtract ))
{
std::cerr << "[FAILED]" << std::endl;
failed = true;
}
else
{
std::cout << "[PASSED]" << std::endl;
}
}
// Test with Region and Linear iterators...
{
// Create a small image
VectorImageType::Pointer vectorImage = VectorImageType::New();
VectorImageType::IndexType start;
itk::VariableLengthVector< PixelType > f( VectorLength );
itk::VariableLengthVector< PixelType > ZeroPixel( VectorLength );
ZeroPixel.Fill( itk::NumericTraits< PixelType >::Zero );
for( unsigned int i=0; i<VectorLength; i++ ) { f[i] = i; }
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z
VectorImageType::SizeType size;
size[0] = 10; // size along X
size[1] = 10; // size along Y
size[2] = 5; // size along Z
VectorImageType::RegionType region( start, size );
vectorImage->SetVectorLength( VectorLength );
vectorImage->SetRegions( region );
vectorImage->Allocate();
vectorImage->FillBuffer( ZeroPixel );
start[0]=3; start[1]=3;start[2]=2;
size[0]=4;size[1]=4;size[2]=2;
VectorImageType::RegionType subRegion( start, size );
typedef itk::ImageRegionIterator< VectorImageType > ImageRegionIteratorType;
ImageRegionIteratorType rit( vectorImage, subRegion );
rit.GoToBegin();
while( !rit.IsAtEnd() )
{
rit.Set( f );
++rit;
}
typedef itk::ImageRegionConstIterator< VectorImageType > ConstIteratorType;
ConstIteratorType cit( vectorImage, vectorImage->GetBufferedRegion() );
unsigned long ctr = 0;
cit.Begin();
while( !cit.IsAtEnd() )
{
itk::VariableLengthVector< PixelType > value = cit.Get();
++cit;
if( ctr == (3*10*10 + 5*10 + 5) )
{
if( value != f )
{
std::cerr <<
"ImageRegionConstIteratorTest on VectorImage [FAILED]" << std::endl;
failed = true;
}
}
++ctr;
}
std::cout << "ImageRegionConstIteratorTest on VectorImage [PASSED]" << std::endl;
{
// Test itkImageLinearIteratorWithIndex
typedef itk::ImageLinearConstIteratorWithIndex< VectorImageType > LinearConstIteratorType;
typedef itk::ImageLinearIteratorWithIndex< VectorImageType > LinearIteratorType;
LinearConstIteratorType lcit( vectorImage, vectorImage->GetBufferedRegion() );
lcit.SetDirection( 2 );
lcit.GoToBegin();
itk::VariableLengthVector< PixelType > value;
while( !lcit.IsAtEnd() )
{
while( !lcit.IsAtEndOfLine() )
{
value = lcit.Get();
if( subRegion.IsInside( lcit.GetIndex() ) )
{
if( value!=f )
{
std::cerr <<
"ImageLinearConstIteratorWithIndex on VectorImage [FAILED]" << std::endl;
failed = true;
}
}
else
{
if( value!=ZeroPixel )
{
std::cerr <<
"ImageLinearConstIteratorWithIndex on VectorImage [FAILED]" << std::endl;
failed = true;
}
}
++lcit;
}
lcit.NextLine();
}
VectorImageType::IndexType idx;
idx[0]=1;idx[1]=1;idx[2]=1;
LinearIteratorType lit( vectorImage, vectorImage->GetBufferedRegion() );
lit.SetIndex( idx );
lit.Set( f );
lcit.SetIndex( idx );
value = lcit.Get();
if( value != f )
{
std::cerr <<
"ImageLinearConstIteratorWithIndex on VectorImage [FAILED]" << std::endl;
failed = true;
}
std::cout << "ImageLinearConstIteratorWithIndex on VectorImage [PASSED]" << std::endl;
std::cout << "ImageLinearIteratorWithIndex on VectorImage [PASSED]" << std::endl;
}
}
}
// Test IO support.
{
// Create an image using itk::Vector
typedef itk::Vector< PixelType, VectorLength > VectorPixelType;
typedef itk::Image< itk::Vector< PixelType, VectorLength >,
Dimension > VectorImageType;
VectorImageType::Pointer image = VectorImageType::New();
VectorImageType::IndexType start;
start[0]=0; start[1]=0; start[2]=0;
VectorImageType::SizeType size;
size[0]=5; size[1]=5; size[2]=5;
VectorImageType::RegionType region( start, size );
image->SetRegions( region );
image->Allocate();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -