[Insight-users] call metric in Observer code...bug?
Luis Ibanez
luis.ibanez at kitware.com
Mon Dec 7 13:02:20 EST 2009
Hi Serena,
Please run the code in a debugger,
and after it crashes:
Grab the call-stack trace,
and post it to the list.
The typical suspects at this point are:
A) you are passing a negative number to an unsigned int
variable,
or
B) You are attempting to use the BSpline transform
before it has been initialized.
Thanks
Luis
-----------------------------------------
On Fri, Dec 4, 2009 at 8:23 PM, Serena Fabbri <fabbri at u.washington.edu> wrote:
>
> 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