[Insight-users] call metric in Observer code...bug?
Serena Fabbri
fabbri at u.washington.edu
Fri Dec 4 20:23:14 EST 2009
Hi Luis,
I don't use Bulk Transform for the Deformable Registration task because the
fixed and the moving images are already Rigid Registered.
I mean: fixed image: MRI
moving image: Rigid Registered CT image.
-----
My images are float and the ScalarType for BSpline Transformation is double.
I think there is a problem in Trasformation parameters because
If I try to print the parameters in the observer code, I get the error message :
> > BSpline_MMI_RSG(4731) malloc: *** vm_allocate(size=4294926336) failed (error
> > code=3)
> > BSpline_MMI_RSG(4731) malloc: *** error: can't allocate region
> > BSpline_MMI_RSG_1(4731) malloc: *** set a breakpoint in szone_error to debug
> > Abort trap
#include "itkCommand.h"
class CommandIterationUpdate : public itk::Command {
public:
typedef CommandIterationUpdate Self;
typedef itk::Command Superclass;
typedef itk::SmartPointer<Self> Pointer;
itkNewMacro( Self );
protected:
CommandIterationUpdate() {};
public:
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
typedef const OptimizerType * OptimizerPointer;
typedef itk::OrientedImage< float, 3 > FixedImageType;
typedef const FixedImageType* FixedImagePointer;
typedef itk::OrientedImage< float, 3 > MovingImageType;
typedef const MovingImageType* MovingImagePointer;
typedef itk::MattesMutualInformationImageToImageMetric< FixedImageType,
MovingImageType
> MetricType;
typedef const MetricType* MetricPointer;
typedef itk::BSplineDeformableTransform< double,3,3 > DeformableTransformType;
typedef const DeformableTransformType* TransformPointer;
MetricPointer m_Metric;
TransformPointer m_Transform;
FixedImagePointer m_FixedImage;
MovingImagePointer m_MovingImage;
void SetTransform( DeformableTransformType* transform ) { m_Transform =
transform; }
void SetFixedImage( FixedImageType* fixed ) { m_FixedImage =
fixed; }
void SetMovingImage( MovingImageType* moving ) { m_MovingImage =
moving; }
void SetMetric(MetricType* metric ) { m_Metric = metric;}
void Execute(itk::Object *caller, const itk::EventObject & event)
{
Execute( (const itk::Object *)caller, event);
}
if( !(itk::IterationEvent().CheckEvent( &event )) )
{
return;
}
OptimizerType::ParametersType parameters;
parameters = m_Transform->GetParameters(); <-----???
std::cout<<parameters<<std::endl;
double metricval = m_Metric->GetValue(parameters);
std::cout << optimizer->GetCurrentIteration() << " MIglobal "<<
optimizer->GetValue()<< " "<<m_Metric->GetValue(parameters);
std::cout << std::endl;
}}
thanks again in advance for any suggestions.
Serena.
On Thu, 3 Dec 2009, Luis Ibanez wrote:
> Hi Serena,
>
> Thanks for the details....
>
> but... I have now more questions here
>
> In (A), I guess that you meant that you pass to the local
> BSpline transform the same AFFINE transform that you
> used for the Bulk Transform of the Global BSpline Transform.
>
> Is that right ?
>
>
> --
>
> The Error:
> BSpline_MMI_RSG(4731) malloc: *** vm_allocate(size=4294926336) failed
> (error code=3)
>
> Seems to be the result of storing a negative number into an
> unsigned type, in which case you get the modulo 2 of that
> number under the 32 bits conversion.
>
>
> The number "4294926336" is what you will get if you
> assign -40960 to an unsigned type.
>
> One of your computations may have slipped an incorrect sign....
>
>
>
> B) When you set the optimizer for the local region you probably should
> start with a very small step length.
>
> What value of "maximum step length" are you currently using ?
>
>
> C) Using All pixels in the small regions
> sounds like the right thing to do in this case.
>
>
>
> Regards,
>
>
> Luis
>
>
> --------------------------------------------------------------------------------
------------
> On Thu, Dec 3, 2009 at 2:05 PM, Serena Fabbri <fabbri at u.washington.edu> wrote:
>> Hi Luis,
>>
>> A)
>> I am using BSpline Transform.
>> I pass the Trasform used for Global MI to the metric2.
>>
>> If I define a Transform for the small region I obtain this error:
>>
>> BSpline_MMI_RSG(4731) malloc: *** vm_allocate(size=4294926336) failed (error
>> code=3)
>> BSpline_MMI_RSG(4731) malloc: *** error: can't allocate region
>> BSpline_MMI_RSG_1(4731) malloc: *** set a breakpoint in szone_error to debug
>> Abort trap
>>
>>
>>
>> This is the code for the Transform
>>
>> FixedImageType::IndexType start;
>> FixedImageType::SizeType size;
>>
>> start[0]=43;
>> start[1]=17;
>> start[2]=0;
>>
>> size[0]=10;
>> size[1]=13;
>> size[2]=20;
>>
>>
>> FixedImageType::RegionType fixedRegionMetric;
>> fixedRegionMetric.SetIndex(start);
>> fixedRegionMetric.SetSize(size);
>>
>>
>> typedef DeformableTransformType::RegionType RegionTypeM;
>> RegionTypeM bsplineRegionM;
>> RegionTypeM::SizeType gridSizeOnImageM;
>> RegionTypeM::SizeType gridBorderSizeM;
>> RegionTypeM::SizeType totalGridSizeM;
>>
>> unsigned int numberOfGridNodesInOneDimensionCoarseM = 3;
>> numberOfGridNodesInOneDimensionCoarseM = 10;
>> gridSizeOnImageM.Fill( numberOfGridNodesInOneDimensionCoarseM );
>> gridBorderSizeM.Fill( SplineOrder ); // Border for spline order = 3 ( 1
>> lower, 2 upper )
>> totalGridSizeM = gridSizeOnImageM + gridBorderSizeM;
>>
>> bsplineRegionM.SetSize( totalGridSizeM );
>>
>>
>> SpacingType spacingM = fixedImage->GetSpacing();
>> OriginType originM = fixedImage->GetOrigin();
>>
>> FixedImageType::SizeType fixedImageSizeM = fixedRegionMetric.GetSize();
>> std::cout<<fixedRegionMetric.GetSize()<<std::endl;
>>
>> for(unsigned int r=0; r<ImageDimension; r++)
>> {
>> spacingM[r] *= static_cast<double>(fixedImageSizeM[r] - 1) /
>> static_cast<double>(gridSizeOnImageM[r] - 1);
>> }
>>
>> FixedImageType::DirectionType gridDirectionM = fixedImage->GetDirection();
>> SpacingType gridOriginOffsetM = gridDirectionM * spacingM;
>>
>> OriginType gridOriginM = originM - gridOriginOffsetM;
>>
>> bsplineTransformCoarseM->SetGridSpacing( spacingM );
>> bsplineTransformCoarseM->SetGridOrigin( gridOriginM );
>> bsplineTransformCoarseM->SetGridRegion( bsplineRegionM );
>> bsplineTransformCoarseM->SetGridDirection( gridDirectionM );
>> bsplineTransformCoarseM->SetParameters(
>> initialDeformableTransformParameters );
>>
>>
>>
>>
>> B)
>> local MI uses the same optimizer than global MI (Regular Step Gradient
>> Descent).
>> It works fine in the registration task.
>>
>>
>> C)
>> I used SetUseAllPixels for the small region too. The region is small in fact
>> the number of pixel is 2600.
>>
>>
>>
>>
>>
>>
>>
>> On Wed, 2 Dec 2009, Luis Ibanez wrote:
>>
>>> Hi Serena,
>>>
>>>
>>> Thanks for the update.
>>>
>>>
>>> The new error message indicates that the number of samples
>>> landing in the overlapping region between the FixedImageRegion
>>> and the moving image is too small.
>>>
>>> This is usually an indication of:
>>>
>>>
>>> A) A poorly initialized Transform, or
>>>
>>> B) A transform that went too far
>>> usually due to a misconfigured optimizer
>>>
>>> C) Setting the number of samples
>>> to a value that is too small.
>>>
>>>
>>> Let's start with (A),.... how are you initializing
>>> the Transform used to compute the value of MI
>>> in the local small regions ?
>>>
>>>
>>> Please let us know,
>>>
>>>
>>> Thanks
>>>
>>>
>>> Luis
>>>
>>>
>>> -----------------------------------------------------
>>> On Wed, Dec 2, 2009 at 5:52 PM, Serena Fabbri <fabbri at u.washington.edu>
>>> wrote:
>>>>
>>>> Hi Luis,
>>>>
>>>> Thank you for your replay.
>>>>
>>>> I think it was my oversight because I printed the globalMI
>>>> twice......sorry
>>>> about that!!
>>>>
>>>>
>>>> I fixed the code and now I am obtaining this error:
>>>>
>>>> ExceptionObject caught !
>>>>
>>>> itk::ExceptionObject (0xd01060)
>>>> Location: "typename itk::ImageToImageMetric<TFixedImage,
>>>> TMovingImage>::MeasureType
>>>> itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>>>> TMovingImage>::GetValue(typename itk::ImageToImageMetric<TFixedImage,
>>>> TMovingImage>::ParametersType&) const [with TFixedImage =
>>>> itk::OrientedImage<float, 3>, TMovingImage = itk::OrientedImage<float,
>>>> 3>]"
>>>> File: /Users/fabbri/InsightToolkit-
>>>> 3.10.0/Code/Algorithms/itkMattesMutualInformationImageToImageMetric.txx
>>>> Line: 830
>>>> Description: itk::ERROR:
>>>> MattesMutualInformationImageToImageMetric(0xd01b00): Too many samples map
>>>> outside moving image buffer: 0 / 1000
>>>>
>>>>
>>>> I have taken a look to MattesMutualInformation code and I have found
>>>> that:
>>>> Initialize() calls PreComputeTransformValues()
>>>> In PreComputeTransformValues() weights and indices are calculated.
>>>> I have found that weights are 0 or e-306 and the indices are always 0.
>>>> These values are used in TransformPoint (GetValue() code) to calculate
>>>> the
>>>> mappedPoints.
>>>> The calculated mappedPoints are outside my movingImage.
>>>>
>>>> I'd like to ask you if it is a bug or I get this error because the region
>>>> I
>>>> used for MI local is really little compared to fixed and moving image.
>>>>
>>>> Any suggestion will be very appreciate.
>>>>
>>>> Thank you.
>>>> Serena.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Tue, 1 Dec 2009, Luis Ibanez wrote:
>>>>
>>>>> Hi Serena,
>>>>>
>>>>> Thanks for letting us know of your progress.
>>>>>
>>>>> --
>>>>>
>>>>> Regarding your question,
>>>>>
>>>>> Please note that Mutual Information is NOT and additive measure.
>>>>>
>>>>>
>>>>> That is, if you computed a value of Mutual Information, in a region R,
>>>>> and then you partition that Region R into two subregions R1 and R2,
>>>>> and compute Mutual information in R1 and then in R2, the sum of
>>>>> these two last numbers will NOT be equal to the mutual information
>>>>> of R.
>>>>>
>>>>> In short:
>>>>>
>>>>> MI( R ) != MI( R1 ) + MI( R2 )
>>>>>
>>>>> This is because MI is related to the logs of probabilities of intensity
>>>>> pairs (pixel counts).
>>>>>
>>>>> So... it still may be ok that you get similar values of Mutual
>>>>> Information
>>>>> from MI(R) and MI( R1). In principle, it just tells you that the
>>>>> statistical
>>>>> distribution of pixels intensity pairs in the Region R is similar to the
>>>>> one
>>>>> in the subregion R1.
>>>>>
>>>>> I don't know if that helps you with the original goal that you had for
>>>>> computing MI in subregions of the image.....
>>>>>
>>>>>
>>>>> Regards,
>>>>>
>>>>>
>>>>> Luis
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------------
--
>>
>> ---
>>>>
>>>> ---
>>>>>
>>>>> On Mon, Nov 30, 2009 at 8:10 PM, Serena Fabbri <fabbri at u.washington.edu>
>>>>> wrote:
>>>>>>
>>>>>> Hi Luis,
>>>>>>
>>>>>> thank you very much to explain clearly the mistake.
>>>>>> I fixed the code and now I am able to calculate local MI.
>>>>>>
>>>>>>
>>>>>> Now I am a bit surprised because the SetFixedImageRegion is (10,17,20)
>>>>>> pixelsize and the FixedImage is (80,80,101) pixelsize and
>>>>>> I am finding that the values of local MI are pretty close to the global
>>>>>> values of MI. I use all pixel for local MI and 10% of statistic for
>>>>>> global
>>>>>> MI.
>>>>>>
>>>>>> Do you think this is reasonable?
>>>>>>
>>>>>> Thanks again for any suggestion.
>>>>>>
>>>>>> Serena.
>>>>>>
>>>>>>
>>>>>> These are the results of LOCAL MI:
>>>>>>
>>>>>> 0 -0.420331 1 -0.437285 2 -0.452543 3 -0.46165 4
>>>>>> -0.468013
>>>>>> 5 -0.473045 6 -0.476698 7 -0.479594 8 -0.482887 9
>>>>>> -0.484799 10 -0.48746 11 -0.489388 12 -0.490882 13
>>>>>> -0.492886
>>>>>> 14 -0.494813 15 -0.495938 16 -0.497812 17 -0.498596
>>>>>> 18
>>>>>> -0.500178 19 -0.501496 20 -0.502828 21 -0.503783 22
>>>>>> -0.504879 23 -0.506142 24 -0.507478 25 -0.508179 26
>>>>>> -0.509647 27 -0.51022 28 -0.511936 29 -0.51237 30
>>>>>> -0.51411
>>>>>> 31 -0.514496 32 -0.516189 33 -0.516839 34 -0.518303 35
>>>>>> -0.518713 36 -0.520112 37 -0.520491 38 -0.521601 39
>>>>>> -0.522019 40 -0.523052 41 -0.523425 42 -0.524304 43
>>>>>> -0.524585 44 -0.525526 45 -0.52578 46 -0.526725 47
>>>>>> -0.526987
>>>>>> 48 -0.528026 49 -0.528595 50 -0.529578
>>>>>>
>>>>>>
>>>>>> -GLOBAL MI
>>>>>> 0 -0.420331 1 -0.437285 2 -0.452543 3 -0.46165 4
>>>>>> -0.468013
>>>>>> 5 -0.473045 6 -0.476698 7 -0.479594 8 -0.482887 9
>>>>>> -0.484799 10 -0.48746 11 -0.489388 12 -0.490882 13
>>>>>> -0.492886
>>>>>> 14 -0.494813 15 -0.495938 16 -0.497812 17 -0.498596
>>>>>> 18
>>>>>> -0.500178 19 -0.501496 20 -0.502828 21 -0.503783 22
>>>>>> -0.504879 23 -0.506142 24 -0.507478 25 -0.508179 26
>>>>>> -0.509647 27 -0.51022 28 -0.511936 29 -0.51237 30
>>>>>> -0.51411
>>>>>> 31 -0.514496 32 -0.516189 33 -0.516839 34 -0.518303 35
>>>>>> -0.518713 36 -0.520112 37 -0.520491 38 -0.521601 39
>>>>>> -0.522019 40 -0.523052 41 -0.523425 42 -0.524304 43
>>>>>> -0.524585 44 -0.525526 45 -0.52578 46 -0.526725 47
>>>>>> -0.526987
>>>>>> 48 -0.528026 49 -0.528595
>>>>>>
>>>>>>
>>>>>> On Thu, 26 Nov 2009, Luis Ibanez wrote:
>>>>>>
>>>>>>> Serena,
>>>>>>>
>>>>>>> The "caller" argument of the Execute method is an Observer
>>>>>>> is the pointer to the object that invoked the event.
>>>>>>>
>>>>>>> In your particular case, this is the Optimizer.
>>>>>>>
>>>>>>> As Bill explained,
>>>>>>> you can only cast "caller" to the OptimizerType.
>>>>>>>
>>>>>>>
>>>>>>> For all the other elements of the registration framework, you have
>>>>>>> to pass them through other means to the command.
>>>>>>>
>>>>>>> One way of doing this is to have them as Member variables,
>>>>>>> and to have "Set" methods for them.
>>>>>>>
>>>>>>> Like
>>>>>>>
>>>>>>>> class CommandIterationUpdate : public itk::Command {
>>>>>>>> public:
>>>>>>>> typedef CommandIterationUpdate Self;
>>>>>>>> typedef itk::Command Superclass;
>>>>>>>> typedef itk::SmartPointer<Self> Pointer;
>>>>>>>> itkNewMacro( Self );
>>>>>>>>
>>>>>>>> protected:
>>>>>>>> CommandIterationUpdate() {};
>>>>>>>>
>>>>>>>> public:
>>>>>>>> typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
>>>>>>>> typedef const OptimizerType * OptimizerPointer;
>>>>>>>>
>>>>>>>> typedef itk::OrientedImage< float, 3 > FixedImageType;
>>>>>>>> typedef const FixedImageType* FixedImagePointer;
>>>>>>>>
>>>>>>>> typedef itk::OrientedImage< float, 3 > MovingImageType;
>>>>>>>>
>>>>>>>> typedef itk::MattesMutualInformationImageToImageMetric<
>>>>>>>> FixedImageType, MovingImageType
>>>>>>>>>
>>>>>>>>> MetricType;
>>>>>>>>
>>>>>>>> typedef const MetricType* MetricPointer;
>>>>>>>>
>>>>>>>> typedef itk::BSplineDeformableTransform< double,3,3 >
>>>>>>>> DeformableTransformType;
>>>>>>>> typedef const DeformableTransformType* TransformPointer;
>>>>>>>>
>>>>>>> MetricPointer m_Metric;
>>>>>>> TransformPointer m_Transform;
>>>>>>> FixedImagePointer m_FixedImage;
>>>>>>> MovingImagePointer m_MovingImage;
>>>>>>>
>>>>>>>
>>>>>>> public:
>>>>>>>
>>>>>>> SetTransform( TransformType * transform ) { m_Transform = transform;
>>>>>>> }
>>>>>>> SetFixedImage( FixedImageType * fixed ) { m_FixedImage = fixed; }
>>>>>>> SetMovingImage( MovingImageType * moving ) { m_MovingImage = moving;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> and then you can use them in your Execute method.
>>>>>>>
>>>>>>> Also,
>>>>>>> when you connect the Command to the optimizer,
>>>>>>> you should also do:
>>>>>>>
>>>>>>>
>>>>>>> observer->SetFixedImage( fixedImage );
>>>>>>> observer->SetMovingImage( movingImage );
>>>>>>> observer->SetTransform( transform );
>>>>>>>
>>>>>>> optimizer->AddObserver( itk::IterationEvent(), observer );
>>>>>>>
>>>>>>> In this way, the components of the registration framework
>>>>>>> will be available to the internals of your observer class.
>>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>>
>>>>>>>
>>>>>>> Luis
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ------------------------------------------------------------------------
---
>>
>> --
>>>>
>>>> --
>>>>>>>
>>>>>>> On Wed, Nov 25, 2009 at 8:51 PM, Serena Fabbri
>>>>>>> <fabbri at u.washington.edu>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> Hi All,
>>>>>>>>
>>>>>>>> I am registering CT image and MRI image with Mattes MI and Bspline
>>>>>>>> Transformation.
>>>>>>>> I'd like to know the value of MI of a little area of the fixed image
>>>>>>>> during
>>>>>>>> the registration process.
>>>>>>>> I call the metric in the observer code but i get a bus error.
>>>>>>>>
>>>>>>>> could anybody suggest me where the error is?
>>>>>>>>
>>>>>>>> Thank you very much.
>>>>>>>>
>>>>>>>> Serena
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> class CommandIterationUpdate : public itk::Command {
>>>>>>>> public:
>>>>>>>> typedef CommandIterationUpdate Self;
>>>>>>>> typedef itk::Command Superclass;
>>>>>>>> typedef itk::SmartPointer<Self> Pointer;
>>>>>>>> itkNewMacro( Self );
>>>>>>>>
>>>>>>>> protected:
>>>>>>>> CommandIterationUpdate() {};
>>>>>>>>
>>>>>>>> public:
>>>>>>>> typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
>>>>>>>> typedef const OptimizerType * OptimizerPointer;
>>>>>>>>
>>>>>>>> typedef itk::OrientedImage< float, 3 > FixedImageType;
>>>>>>>> typedef const FixedImageType* FixedImagePointer;
>>>>>>>>
>>>>>>>> typedef itk::OrientedImage< float, 3 > MovingImageType;
>>>>>>>>
>>>>>>>> typedef itk::MattesMutualInformationImageToImageMetric<
>>>>>>>> FixedImageType, MovingImageType
>>>>>>>>>
>>>>>>>>> MetricType;
>>>>>>>>
>>>>>>>> typedef const MetricType* MetricPointer;
>>>>>>>>
>>>>>>>> typedef itk::BSplineDeformableTransform< double,3,3 >
>>>>>>>> DeformableTransformType;
>>>>>>>> typedef const DeformableTransformType* TransformPointer;
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> void Execute(itk::Object *caller, const itk::EventObject & event)
>>>>>>>> {
>>>>>>>> Execute( (const itk::Object *)caller, event);
>>>>>>>> }
>>>>>>>>
>>>>>>>> void Execute(const itk::Object * object, const itk::EventObject &
>>>>>>>> event)
>>>>>>>> {
>>>>>>>>
>>>>>>>> OptimizerPointer optimizer = dynamic_cast<
>>>>>>>> OptimizerPointer
>>>>>>>>>
>>>>>>>>> ( object );
>>>>>>>>
>>>>>>>> MetricPointer metric = dynamic_cast< MetricPointer >(
>>>>>>>> object
>>>>>>>> );
>>>>>>>> TransformPointer transform = dynamic_cast<
>>>>>>>> TransformPointer
>>>>>>>>>
>>>>>>>>> ( object );
>>>>>>>>
>>>>>>>> FixedImagePointer fixedImage = dynamic_cast<
>>>>>>>> FixedImagePointer>(
>>>>>>>> object );
>>>>>>>> FixedImageType::IndexType start;
>>>>>>>> FixedImageType::SizeType size;
>>>>>>>>
>>>>>>>> start[0]=43;
>>>>>>>> start[1]=30;
>>>>>>>> start[2]=0;
>>>>>>>>
>>>>>>>> size[0]=10;
>>>>>>>> size[1]=17;
>>>>>>>> size[2]=20;
>>>>>>>>
>>>>>>>>
>>>>>>>> FixedImageType::RegionType fixedRegionMetric ;
>>>>>>>> fixedRegionMetric.SetIndex(start);
>>>>>>>> fixedRegionMetric.SetSize(size);
>>>>>>>>
>>>>>>>> OptimizerType::ParametersType parameters;
>>>>>>>>
>>>>>>>>
>>>>>>>> if( !(itk::IterationEvent().CheckEvent( &event )) )
>>>>>>>> {
>>>>>>>> return;
>>>>>>>> }
>>>>>>>> metric->SetFixedImageRegion(fixedRegionMetric);
>>>>>>>> metric->SetUseAllPixels( true );
>>>>>>>> parameters = transform->GetParameters();
>>>>>>>>
>>>>>>>>
>>>>>>>> std::cout << optimizer->GetCurrentIteration() << "MIglobal
>>>>>>>> "<<
>>>>>>>> optimizer->GetValue() << " MIlocal "<<metric->GetValue(parameters);
>>>>>>>> std::cout << std::endl;
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> }
>>>>>>>> };
>>>>>>>>
>>>>>>>>
>>>>>>>> _____________________________________
>>>>>>>> Powered by www.kitware.com
>>>>>>>>
>>>>>>>> Visit other Kitware open-source projects at
>>>>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>>>>
>>>>>>>> Kitware offers ITK Training Courses, for more information visit:
>>>>>>>> http://www.kitware.com/products/protraining.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
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>
More information about the Insight-users
mailing list