[Insight-users] Problems using the ithDeformableMesh3DFilter filter...need help!
Julien Mercenier
itk_julienmercenier at hotmail.com
Sun, 7 Mar 2004 01:10:10 +0100
This is a multi-part message in MIME format.
------=_NextPart_000_0007_01C403E0.EFB7E320
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Hi Luis,
before all : thank you for all your advices...
as other students working on the brain (registration, fusion,
vizualisation) with me
You really do a great job...
I've been working on the same problem for more than 5 days.
I still have the same problem (even trying to tune all the parameters).
If someone could launch or read the code joined here...it would be so
kind !!!!!!!!!!!!!
The image is a little sphere in *.img (*.hdr) format.
The initial mesh I create (with a lot of work) by hand is a cube. (49 nodes
and 96 triangles).
The description of the bug I encounter is below.
As a reminder :
The little description of my system : - athlon1400MHz, 256
DDRAM, Windows XP
-ALL_BUILD -
Win32Debug for ITK, VTK and all the programs I write
If someone finds the problem, please tell me...
A million thanks...
Julien
P.S : in the pipeline, there is a point I'm really not sure to be true.
It is where I define the initial mesh of te DeformableMesh3DFilter
"
deformableModelFilter->SetInput(mesh); //mesh is the mesh I creayed by
hand (smartpointer)
deformableModelFilter->SetGradient(gradientMapFilter->GetOutput()); "
----- Original Message -----
From: "Luis Ibanez" <luis.ibanez at kitware.com>
To: "Julien Mercenier" <itk_julienmercenier at hotmail.com>
Cc: <insight-users at itk.org>
Sent: Friday, March 05, 2004 9:51 PM
Subject: Re: [Insight-users] Problems using the ithDeformableMesh3DFilter
filter...need help!
> Hi Julien,
>
> 1) Given that you have a brain image and its deformed version
> you could find the vector deformation field relating the two
> images by using the DemonsRegistrationFilter.
>
http://www.itk.org/Insight/Doxygen/html/classitk_1_1DemonsRegistrationFilter.html
>
> You will find a description of this filter in the SoftwareGuide
>
> http://www.itk.org/ItkSoftwareGuide.pdf
>
>
> 2) The truncation of the identifies is not the reason for
> the crash. With the DeformableMesh filter, chances are
> that the forces are trying to make it evolve too fast, and
> the geometrical consistence of the mesh gets disrupted.
>
>
> 3) The way to avoid big forces is to increase stiffness and
> to reduce the step size. You also may want to write to
> a file the vector force field that you are computing.
> They usually have surprising features.
>
> You may use ParaView for visualizing the Vector Field:
>
> http://www.paraview.org
>
>
>
> Note that you can also use the FEM-Deformable model
> in order to find a deformation field mapping one brain
> into another. This FEM model *will not* be equivalent
> to the one that you actually want to create for modeling
> the physical deformation, but it will make it possible
> for you to compute a vector deformation field.
>
>
>
>
> Regards,
>
>
> Luis
>
>
> -------------------
>
> Julien Mercenier wrote:
>
> > First,
> > thanks for your answers...
> >
> > About your questions :
> > "Are you bulding something like a finite elements model
> > of the brain ?"
> >
> > Yes, I am.
> >
> > But, I have to take this sort of initial mesh (from Isosurf)
> > to characterize the displacements from a brain to a deformed brain.
> > (The segmentation is already done...)
> > Therefore, I'd like to use forces derived from the deformed brain image
> > (first a simple gradient, then balloon and then gradient vector flow)
> > so the the itkDeformableMesh3DFilter filter seems to be the answer to
this
> > problem.
> >
> > (1) Is there thus possible to do this by the way I told ?
> > Or do I have to reconsider the way I to solve this problem ?
> >
> > (2) Can the fact that some identifiers were truncated make the
program
> > crash ?
> > If this is the case, what can I do (If you know the answers)
?
> >
> >
> > (3) If I can use this filter, the way to avoid such big forces is
> > to raise the stiffness ?
> > but for the time step ?
> >
> >
> > THANKS A LOT for providing such answers : )
> > ----- Original Message -----
> > From: "Luis Ibanez" <luis.ibanez at kitware.com>
> > To: "Julien Mercenier" <itk_julienmercenier at hotmail.com>
> > Cc: <insight-users at itk.org>
> > Sent: Friday, March 05, 2004 4:36 AM
> > Subject: Re: [Insight-users] Problems using the
ithDeformableMesh3DFilter
> > filter...need help!
> >
> >
> >
> >>Hi Julien,
> >>
> >>Thanks a lot for providing such complete description
> >>of your system and the problem you are facing.
> >>
> >>About your questions:
> >>
> >>1) The warning:
> >> "identifier was truncated to '255' characters
> >> in the debug information"
> >>
> >> is an annoying known 'feature' of Visual Studio.
> >> The symbol names generated from templated code
> >> (in particular from normal STL) are too long
> >> for the 255 characters limit of in this compiler.
> >> We use to simply disable the warninng using
> >> the pragma:
> >>
> >> #ifdef _MSC_VER
> >> #pragma warning ( disable : 4786 )
> >> #endif
> >>
> >> Note that this doesn't really solve the problem.
> >> It just ask the compiler to stop complaining
> >> about it, so you can see other more significant
> >> warnings.
> >>
> >>
> >>2) The set of messages at run time are somehow
> >> related to (1). Given that the symbols were
> >> truncated, when the program is crashing, there
> >> is no way to recover some of the symbols.
> >>
> >> The real concern is : why the program is crashing
> >>
> >> One of the typical pathological behaviors of this
> >> filter is to generate forces that are too large
> >> for the scale of displacements, making the nodes
> >> in the mesh be propulsed to far away locations.
> >>
> >> Note that this particular filter is extremely
> >> sensitive to the force computations. You may
> >> want to tune it in order to generate very small
> >> forces in order to produce small displacements
> >> of the mesh nodes.
> >>
> >>
> >> In particular you want to tune the parameters
> >> of "stiffnes" and "time step" in order to
> >> control the magnitude of the forces.
> >>
> >>
> >>
> >>Just for the record,
> >>You probably may want to reconsider your approach for
> >>characterizing the displacements of the brain surface...
> >>
> >>Are you bulding something like a finite elements model
> >>of the brain ?
> >>
> >>If your first goal is to obtain a segmentation of the
> >>brain, you may get better results using Level Sets,
> >>which are a more robuts and reliable implementation
> >>of deformable models.
> >>
> >>
> >>
> >>
> >> Regards,
> >>
> >>
> >>
> >> Luis
> >>
> >>
> >>
> >>
> >>------------------------
> >>Julien Mercenier wrote:
> >>
> >>
> >>>Hi everybody,
> >>>
> >>> Here is a little description of my system : - athlon1400MHz, 256
> >>>DDRAM, Windows XP
> >>> -
> >>>ALL_BUILD - Win32Debug for ITK, VTK and all the programs I write
> >>>
> >>>
> >>> I want to characterize the displacements of the brain surface in
3D.
> >>> To do this, I use the ITK User-Guide exemple using the
> >>>ithDeformableMesh3DFilter filter (page 379).
> >>> But, except of using the itkBinaryMask3DMeshSource filter, I create
> >>>the initial mesh myself.
> >>> This mesh is the result coming from the program Isosurf giving a
> >>>surface mesh in 3D.
> >>> For the calculation of the force field, I use here the same method
> >>>as in the ITK User-guide example.
> >>> The binary image used for this calculation is a deformed brain, in
> >>>*.img format (*.hdr as header)
> >>> (the dimension of this image is 256*256*128 with 00 (not in the
> >>>brain) or 01(in the brain) => this is thus
> >>> a file of 8Mo). The pixel distances are 0.98, 0.98 and 1.56 (mm).
> >>>
> >>> There are several things I don't understant or I can't solve by
> >
> > myself.
> >
> >>> - *At compiling-time, there are 56 warnings (all the sames but for
> >>>different variables).* Here is an example :
> >>>
> >>>J:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\xmemory(64) :
> >>>warning C4786:
> >>>
> >
> >
'std::allocator<itk::SmartPointer<itk::CellInterfaceVisitor<double,itk::Cell
> > TraitsInfo<3,double,double,unsigned
> >
> >>>long,unsigned long,unsigned long,itk::Point<double,3>,
> >>>itk::VectorContainer<unsigned long,itk::Point<double,3>
> >>> >,std::set<unsigned long,std::less<unsigned
> >>>long>,std::allocator<unsigned long> > > > > >' : identifier was
> >>>truncated to '255' characters in the debug information
> >>> J:\Program Files\Microsoft Visual
> >>>Studio\VC98\INCLUDE\xmemory(64) : while compiling class-template member
> >>>function 'void __thiscall
> >>>
> >
> >
std::allocator<itk::SmartPointer<itk::CellInterfaceVisitor<double,itk::CellT
> > raitsInfo<3,double,double,unsigne
> >
> >>>d long,unsigned long,unsigned
> >>>long,itk::Point<double,3>,itk::VectorContainer<unsigned
> >>>long,itk::Point<double,3> >,std::set<unsigned long,std::less<unsigned
> >>>long>,std::allocator<unsigned long> > > > > >::deallocate(void
> >>>*,unsigned int)'
> >>>
> >>> - *At running-time*
> >>>The program stops when using the ithDeformableMesh3DFilter filter :
> >>>there is a bug !! But I don't understand why...even when reading the
> >
> > codes.
> >
> >>>_Then, am message apperas in a window. And, when I click on the debug
> >>>button, a message appears in the visualC++ window :_
> >>>message = " Unhandled exception in def_surf.exe : 0x0000005 : Access
> >>>Violation"
> >>>in vxl/vnl/vnl_matrix_fixed.h indicating the " //get element "
function.
> >>>
> >>>_In the debug window appears the messages :_
> >>>Loaded symbols for 'J:\DEF_SURF\Debug\def_surf.exe'
> >>>Loaded 'J:\WINDOWS\system32\ntdll.dll', no matching symbolic
information
> >>>found.
> >>>Loaded 'J:\WINDOWS\system32\kernel32.dll', no matching symbolic
> >>>information found.
> >>>Loaded symbols for 'J:\WINDOWS\system32\MSVCP60D.DLL'
> >>>Loaded symbols for 'J:\WINDOWS\system32\MSVCRTD.DLL'
> >>>Loaded 'J:\WINDOWS\system32\user32.dll', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\gdi32.dll', no matching symbolic
information
> >>>found.
> >>>Loaded 'J:\WINDOWS\system32\advapi32.dll', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\rpcrt4.dll', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\version.dll', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\msvcrt.dll', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\SHLWAPI.DLL', no matching symbolic
> >>>information found.
> >>>Loaded 'J:\WINDOWS\system32\apphelp.dll', no matching symbolic
> >>>information found.
> >>>The thread 0xBB0 has exited with code 0 (0x0).
> >>>First-chance exception in def_surf.exe: 0xC0000005: Access Violation.
> >>>The program 'J:\DEF_SURF\Debug\def_surf.exe' has exited with code 0
> >
> > (0x0).
> >
> >>>*I put my code just here *(the creation of the mesh don't seem to pose
> >>>any problem)
> >>>**
> >>>/*************************************************************
> >>>*******active deformable surface**************************
> >>>**************************************************************/
> >>>
> >>>
> >>>/*************************************************************
> >>>----------------
> >>>Several steps ==>
> >>>----------------
> >>> 1) use the file to create the mesh
> >>> 2) computing the force field (gradient)
> >>> 3) mesh and forxce field into the DeformableMeshFilter
> >>>***************************************************************/
> >>>
> >>>#include <cstdio> //C-style I/O to read the Isosurf file
> >>>#include <stdio.h>
> >>>
> >>>#include <iostream>
> >>>
> >>>#include "itkMesh.h"
> >>>#include "itkDefaultStaticMeshTraits.h"
> >>>#include "itkTriangleCell.h"
> >>>
> >>>#include "itkDeformableMesh3DFilter.h"
> >>>
> >>>#include "itkGradientRecursiveGaussianImageFilter.h"
> >>>#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"
> >>>
> >>>#include "itkImage.h"
> >>>
> >>>#include "itkCovariantVector.h"//will contain the force field
> >>>
> >>>#include "itkImageFileReader.h"
> >>>
> >>>
> >>>
> >>>int main()
> >>>{
> >>>
> >>> int nbnoeuds = 0;
> >>> int nbtri = 0;
> >>>
> >>> double noeudsAr[3648][3]; //3648 is the number of nodes
> >>> double noeudsdefAr[3648][3];
> >>> int triAr[7280][3]; //7280 is the number of
> >
> > triangles
> >
> >>> FILE* fichier = 0;
> >>>
> >>> /*opening of the file containing the informations about the mesh to
> >>>create (*.off)*/
> >>> fichier = fopen("entry_deformable.off","r");
> >>> fscanf(fichier," %d %d\n",&nbnoeuds, &nbtri);
> >>> std::cout<<"nbnoeuds ="<<nbnoeuds<<'\n';
> >>> std::cout<<"nbtri ="<<nbtri<<'\n';
> >>>
> >>> /*nodes coordinates reading*/
> >>> for(int i=0; i<nbnoeuds; i++)
> >>> {
> >>> fscanf(fichier,"%lf %lf %lf", &noeudsAr[i][0], &noeudsAr[i][1],
> >>>&noeudsAr[i][2]);
> >>> }
> >>>
> >>> /*nodes in each triangle reading*/
> >>> for(int i=0; i<nbtri; i++)
> >>> {
> >>> fscanf(fichier,"%i %i %i", &triAr[i][0], &triAr[i][1], &triAr[i][2]);
> >>> }
> >>>
> >>> /*closing the file (*.off)*/
> >>> fclose(fichier);
> >>>
> >>> /*******************************************************
> >>> mesh creation from the noeudsAr and triAr
> >>> ********************************************************/
> >>>
> >>> /*Characterization of the mesh*/
> >>> const unsigned int PointDimension = 3;
> >>> const unsigned int MaxTopologicalDimension = 2;
> >>>
> >>> typedef double PixelType; //must be the same as GradientPixelType
> >>> typedef double CellDataType;
> >>>
> >>> typedef double CoordinateType;
> >>> typedef double InterpolationWeightType;
> >>>
> >>> typedef itk::DefaultStaticMeshTraits<
> >>> PixelType, PointDimension, MaxTopologicalDimension,
> >>> CoordinateType, InterpolationWeightType, CellDataType > MeshTraits;
> >>>
> >>> typedef itk::Mesh< PixelType, PointDimension, MeshTraits > MeshType;
> >>>
> >>> typedef MeshType::CellType CellType;
> >>> typedef itk::TriangleCell< CellType > TriangleType;
> >>>
> >>> MeshType::Pointer mesh = MeshType::New();
> >>>
> >>> /*points insertion*/
> >>> typedef MeshType::PointType PointType;
> >>> PointType point;
> >>>
> >>> const unsigned int numberOfPoints = nbnoeuds;
> >>>
> >>> for(unsigned int id=0; id<numberOfPoints; id++)
> >>> {
> >>> point[0] = noeudsAr[id][0];
> >>> point[1] = noeudsAr[id][1];
> >>> point[2] = noeudsAr[id][2];
> >>> mesh->SetPoint( id, point );
> >>> }
> >>>
> >>> /*cells inclusion*/
> >>> CellType::CellAutoPointer triangle;
> >>> const unsigned int numberOfCells = nbtri;
> >>> for(unsigned int cellId=0; cellId<numberOfCells; cellId++)
> >>> {
> >>> triangle.TakeOwnership( new TriangleType );
> >>> triangle->SetPointId( 0, triAr[cellId][0] ); // first point
> >>> triangle->SetPointId( 1, triAr[cellId][1] ); // second point
> >>> triangle->SetPointId( 2, triAr[cellId][2]); // third point
> >>> mesh->SetCell( cellId, triangle ); // insert the cell
> >>> }
> >>> /*just a little check*/
> >>> std::cout << "Points = " << mesh->GetNumberOfPoints() << std::endl;
> >>> std::cout << "Cells = " << mesh->GetNumberOfCells() << std::endl;
> >>>
> >>> /****************************************************************
> >>> gradient force field computing
> >>> *****************************************************************/
> >>>
> >>> const unsigned int Dimension = 3;
> >>> typedef double PixelType2;
> >>> typedef itk::Image<PixelType2, Dimension> ImageType;
> >>>
> >>>
> >>> typedef itk::CovariantVector< double, Dimension > GradientPixelType;
> >>> typedef itk::Image< GradientPixelType, Dimension > GradientImageType;
> >>>
> >>>
> >>> typedef itk::GradientRecursiveGaussianImageFilter<ImageType,
> >>>GradientImageType>
> >>> GradientFilterType;
> >>> typedef
> >>>itk::GradientMagnitudeRecursiveGaussianImageFilter<ImageType,ImageType>
> >>> GradientMagnitudeFilterType;
> >>>
> >>> typedef itk::DeformableMesh3DFilter<MeshType,MeshType>
> >>>DeformableFilterType;
> >>>
> >>> typedef itk::ImageFileReader< ImageType > ReaderType;
> >>> ReaderType::Pointer imageReader = ReaderType::New();
> >>>
> >>> imageReader->SetFileName("brain.img");
> >>>
> >>>
> >>> GradientMagnitudeFilterType::Pointer gradientMagnitudeFilter
> >>> = GradientMagnitudeFilterType::New();
> >>>
> >>> gradientMagnitudeFilter->SetInput( imageReader->GetOutput() );
> >>> gradientMagnitudeFilter->SetSigma( 1.0 );
> >>>
> >>> GradientFilterType::Pointer gradientMapFilter =
> >
> > GradientFilterType::New();
> >
> >>> gradientMapFilter->SetInput( gradientMagnitudeFilter->GetOutput());
> >>> gradientMapFilter->SetSigma( 1.0 );
> >>>
> >>> std::cout << "Before map filter"<< std::endl;
> >>>
> >>> gradientMapFilter->Update();
> >>>
> >>> std::cout << "After map filter"<< std::endl;
> >>>
> >>> std::cout << "The gradient map created!" << std::endl;
> >>>
> >>> DeformableFilterType::Pointer deformableModelFilter =
> >>> DeformableFilterType::New();
> >>> deformableModelFilter->SetInput(mesh);
> >>> deformableModelFilter->SetGradient(gradientMapFilter->GetOutput());
> >>>
> >>>
> >>> typedef itk::CovariantVector<double, 2> double2DVector;
> >>> typedef itk::CovariantVector<double, 3> double3DVector;
> >>>
> >>> double2DVector stiffness;
> >>> stiffness[0] = 0.0001;
> >>> stiffness[1] = 0.1;
> >>>
> >>> double3DVector scale;
> >>> scale[0] = 0.98;
> >>> scale[1] = 0.98;
> >>> scale[2] = 1.56;
> >>>
> >>> deformableModelFilter->SetStiffness( stiffness );
> >>> deformableModelFilter->SetScale( scale );
> >>>
> >>> deformableModelFilter->SetGradientMagnitude( 0.8 );
> >>> deformableModelFilter->SetTimeStep( 0.01 );
> >>> deformableModelFilter->SetStepThreshold( 5 );
> >>>
> >>> std::cout << "Deformable mesh fitting...";
> >>>
> >>> try
> >>> {
> >>> deformableModelFilter->Update(); //I think it bugs here
> >>> }
> >>> catch( itk::ExceptionObject & excep )
> >>> {
> >>> std::cerr << "Exception Caught !" << std::endl;
> >>> std::cerr << excep << std::endl;
> >>> }
> >>>
> >>> /**************************************************
> >>>I'd like ti use the output of the last filter too...but it must work :
(
> >>>***************************************************/
> >>> return EXIT_SUCCESS;
> >>>}
> >>>
> >>>*The file used (from ITK, but having been treated to erase nodes having
> >
> > *
> >
> >>>*the same coordinates) has this form :*
> >>>
> >>>for the nodes (coordinates x, y, z) :
> >>>
> >>>96.47731 79.87897 0.00311
> >>>
> >>>103.69083 79.68633 0.00311
> >>>
> >>>91.25018 82.59742 0.00311
> >>>
> >>>for the cells (node1, node 2, node 3)
> >>>
> >>>1598 1594 1718
> >>>
> >>>1595 1600 1719
> >>>
> >>>1599 1595 1719
> >>>
> >>>If someone knows what to do, please tell me...you'll save my life (or
at
> >>>least a good part of it)
> >>>
> >>>Thanks,
> >>>
> >>> Julien Mercenier, BELGIUM, University of Liège
> >>
> >>
> >>
> >>_______________________________________________
> >>Insight-users mailing list
> >>Insight-users at itk.org
> >>http://www.itk.org/mailman/listinfo/insight-users
> >>
> >
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users
> >
>
>
>
>
------=_NextPart_000_0007_01C403E0.EFB7E320
Content-Type: application/x-zip-compressed;
name="argh3.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="argh3.zip"
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
AFETAAAAAA==
------=_NextPart_000_0007_01C403E0.EFB7E320--