[ITK-users] Different output with dense and sparse level set representations
Cagatay Bilgin
bilgincc at gmail.com
Thu Aug 21 13:33:53 EDT 2014
Hello everybody,
I continue with my exploration of the new level set framework. I have
modified one of the examples and have an advection field in the positive x
direction. I would expect the initial contour to move in that direction and
that's the case with the sparse representation. Using the dense
representation however, only half of the contour moves to my surprise. Is
this a bug or I am missing something here. Here is the code and the cmake
file and snapshots of the movements.
[image: Inline image 2][image: Inline image 1]
#include "itkBinaryImageToLevelSetImageAdaptor.h"
#include "itkLevelSetContainer.h"
#include "itkLevelSetEquationPropagationTerm.h"
#include "itkLevelSetEquationAdvectionTerm.h"
#include "itkLevelSetEquationContainer.h"
#include "itkLevelSetEquationTermContainer.h"
#include "itkLevelSetEvolution.h"
#include "itkLevelSetEvolutionNumberOfIterationsStoppingCriterion.h"
#include "itkLevelSetDenseImage.h"
#include "itkVTKVisualizeImageLevelSetIsoValues.h"
#include "itkSinRegularizedHeavisideStepFunction.h"
#include "itkLevelSetIterationUpdateCommand.h"
#include "itkLevelSetEquationCurvatureTerm.h"
#include "itkWhitakerSparseLevelSetImage.h"
#include "itkLevelSetSparseImage.h"
typedef itk::Image< float, 2 > FIT;
void CreateSquareImage(FIT::Pointer image, FIT::Pointer prop, FIT::Pointer
advec)
{
FIT::RegionType region;
FIT::IndexType start;
start[0] = 0;
start[1] = 0;
FIT::SizeType size;
size[0] = 100;
size[1] = 100;
region.SetSize(size);
region.SetIndex(start);
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
//constant grow in all directions
prop->SetRegions(image->GetLargestPossibleRegion());
prop->Allocate();
prop->FillBuffer(1);
//advec will increase in positive x direction
advec->SetRegions(image->GetLargestPossibleRegion());
advec->Allocate();
advec->FillBuffer(0);
// Set pixels in a square to one value
for(unsigned int x = 35; x < 65; x++){
for(unsigned int y = 35; y < 65; y++){
FIT::IndexType pixelIndex;
pixelIndex[0] = x;
pixelIndex[1] = y;
image->SetPixel(pixelIndex, 255);
}
}
//advection in positive x direction
for(unsigned int x = 0; x < 100; x++){
for(unsigned int y = 0; y < 100; y++){
FIT::IndexType pixelIndex;
pixelIndex[0] = x;
pixelIndex[1] = y;
advec->SetPixel(pixelIndex, x);
}
}
}
/*
*/
int main(int argc, char* argv[] )
{
using namespace itk;
if(argc != 5)
{
std::cerr << "Missing Arguments" << std::endl;
std::cerr << argv[0] << std::endl;
std::cerr << "1- Number of Iterations" << std::endl;
std::cerr << "2- Propagation Term" << std::endl;
std::cerr << "3- Advection Term" << std::endl;
std::cerr << "4- Curvature Term" << std::endl;
return EXIT_FAILURE;
}
FIT::Pointer input = FIT::New();
FIT::Pointer prop = FIT::New();
FIT::Pointer advec = FIT::New();
CreateSquareImage(input, prop, advec);
int numberOfIterations = atoi(argv[1]);
typedef float LSPT;
typedef Image< LSPT, 2 > LSIT;
typedef LevelSetDenseImage< LSIT > LST;
//typedef WhitakerSparseLevelSetImage< LSPT, 2 > LST;
typedef LST::OutputRealType LSOutputT;
// convert a binary mask to a level-set function
typedef BinaryImageToLevelSetImageAdaptor<FIT, LST > BI2LST;
BI2LST::Pointer adaptor = BI2LST::New();
adaptor->SetInputImage(input );
adaptor->Initialize();
LST::Pointer levelSet = adaptor->GetLevelSet();
// The Heaviside function
typedef SinRegularizedHeavisideStepFunction<LSOutputT, LSOutputT>
HeavisideFunctionType;
HeavisideFunctionType::Pointer heaviside = HeavisideFunctionType::New();
heaviside->SetEpsilon(1 );
// Create the level set container
typedef LevelSetContainer< IdentifierType, LST > LSContainerT;
LSContainerT::Pointer levelSetContainer = LSContainerT::New();
levelSetContainer->SetHeaviside(heaviside );
levelSetContainer->AddLevelSet(0, levelSet );
// Create the terms.
typedef LevelSetEquationPropagationTerm<FIT, LSContainerT> PropT;
PropT::Pointer propagationTerm = PropT::New();
propagationTerm->SetInput(prop);
propagationTerm->SetCoefficient(atof(argv[2]));
typedef LevelSetEquationAdvectionTerm<FIT, LSContainerT> AdvecT;
AdvecT::Pointer advectionTerm = AdvecT::New();
advectionTerm->SetInput(advec);
advectionTerm->SetCoefficient(atof(argv[3]));
typedef LevelSetEquationCurvatureTerm<FIT, LSContainerT> CurvT;
CurvT::Pointer curvatureTerm = CurvT::New();
curvatureTerm->SetCoefficient(atof(argv[4]));
// Create term container (equation rhs)
typedef LevelSetEquationTermContainer< FIT, LSContainerT >
TermContainerT;
TermContainerT::Pointer termContainer = TermContainerT::New();
termContainer->SetLevelSetContainer(levelSetContainer );
termContainer->SetInput(input );
termContainer->AddTerm(0, curvatureTerm );
termContainer->AddTerm(1, advectionTerm );
termContainer->AddTerm(2, propagationTerm );
// Create equation container
typedef LevelSetEquationContainer< TermContainerT >
EquationContainerType;
EquationContainerType::Pointer equationContainer =
EquationContainerType::New();
equationContainer->SetLevelSetContainer(levelSetContainer );
equationContainer->AddEquation(0, termContainer );
// Create stopping criteria
typedef LevelSetEvolutionNumberOfIterationsStoppingCriterion<
LSContainerT > StoppingCriterionType;
StoppingCriterionType::Pointer criterion = StoppingCriterionType::New();
criterion->SetNumberOfIterations(numberOfIterations );
// Create the visualizer
typedef VTKVisualizeImageLevelSetIsoValues< FIT, LST > VisT;
VisT::Pointer visualizer = VisT::New();
visualizer->SetInputImage(input );
visualizer->SetLevelSet(levelSet );
visualizer->SetScreenCapture(true );
// Create evolution class
typedef LevelSetEvolution< EquationContainerType, LST > LSEvolT;
LSEvolT::Pointer evolution = LSEvolT::New();
evolution->SetEquationContainer(equationContainer );
evolution->SetStoppingCriterion(criterion );
evolution->SetLevelSetContainer(levelSetContainer );
typedef LevelSetIterationUpdateCommand< LSEvolT, VisT >
IterationUpdateCommandType;
IterationUpdateCommandType::Pointer iterationUpdateCommand =
IterationUpdateCommandType::New();
iterationUpdateCommand->SetFilterToUpdate(visualizer );
iterationUpdateCommand->SetUpdatePeriod(1 );
evolution->AddObserver(IterationEvent(), iterationUpdateCommand );
evolution->Update();
return EXIT_SUCCESS;
}
cmake_minimum_required(VERSION 2.8)
project(Motion)
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
add_executable(Motion main.cpp)
target_link_libraries(Motion ${ITK_LIBRARIES} ${VTK_LIBRARIES})
Params used for the experiment:
Ran sparse representation with
./Motion 15 0 1 1
Ran dense representation with
./Motion 15 0 1 0
Cemal Cagatay Bilgin, PhD
Life Sciences Division
Lawrence Berkeley National Lab
MS977, One Cyclotron Road
Berkeley, CA 94720, USA
Email: ccbilgin at lbl.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20140821/a2bfd8a6/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sparse_00015.png
Type: image/png
Size: 2848 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20140821/a2bfd8a6/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dense_00010.png
Type: image/png
Size: 2737 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20140821/a2bfd8a6/attachment-0001.png>
More information about the Insight-users
mailing list