[Insight-users] Local MI value...problem

Luis Ibanez luis.ibanez at kitware.com
Thu Nov 26 12:55:34 EST 2009


Hi Serena,

Some compilers will not allow you to initialize member variables
in the declaration of a class.

The lines

>        start[0]=43;
>        start[1]=30;
>        start[2]=0;
>
>        size[0]=10;
>        size[1]=17;
>        size[2]=20;
>


Will have to be moved to an actual method of the class.
For example, to the constructor, or to one of the Execute() methods.


The same goes for the lines

>        fixedRegionMetric.SetIndex(start);
>        fixedRegionMetric.SetSize(size);


You can't call executable lines as if they were declarations in the class.
They have to be moved inside one of the class methods.
The constructor is probably your best option.


    Regards,


           Luis



--------------------------------------------------------
On Tue, Nov 24, 2009 at 8:22 PM, Serena Fabbri <fabbri at u.washington.edu> wrote:
>
> Hi Karthik ,
> thank you for your suggestion.
>
> I have followed  your advice but I get an error message (see below).
> Could you help me again?
>
> Thank you.
>
> Serena
>
>
>
>
>
>
> #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::Image< float, 3 >  FixedImageType;
>        typedef itk::Image< float, 3 >  MovingImageType;
>        typedef itk::MattesMutualInformationImageToImageMetric<
> FixedImageType, MovingImageType
>>
>> MetricType;
>
>        typedef   const MetricType*  MetricPointer;
>
>
>        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);
>
>  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)
>    { MetricPointer MI = dynamic_cast< MetricPointer >( object );
>      OptimizerPointer optimizer = dynamic_cast< OptimizerPointer >( object
> );
>      if( !(itk::IterationEvent().CheckEvent( &event )) )
>        {
>        return;
>        }
>
>
>          MI->SetFixedImageRegion(fixedRegionMetric);
>          MI->SetNumberOfSpatialSamples(numberOfSamples );
>          MI->SetNumberOfHistogramBins( 20 );
>          MI->SetUseExplicitPDFDerivatives( 1 );
>          MI->SetUseCachingOfBSplineWeights( 1 );
>          MI->SetUseAllPixels(1);
>      std::cout << optimizer->GetCurrentIteration() << "MIglobal   "<<
> optimizer->GetValue() << " MIlocal  "<<MI->GetValue();
>      std::cout << std::endl;
>    }
> };
>
>
>
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:119: warning: ISO C++ forbids
>   declaration of `start' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:119: warning: ISO C++ forbids
>   initialization of member `start'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:119: warning: making `start' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:119: error: invalid in-class
>   initialization of static data member of non-integral type `int[0]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:120: warning: ISO C++ forbids
>   declaration of `start' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:120: warning: ISO C++ forbids
>   initialization of member `start'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:120: warning: making `start' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:120: error: invalid in-class
>   initialization of static data member of non-integral type `int[1]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:121: warning: ISO C++ forbids
>   declaration of `start' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:121: warning: ISO C++ forbids
>   initialization of member `start'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:121: warning: making `start' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:121: error: invalid in-class
>   initialization of static data member of non-integral type `int[2]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:123: warning: ISO C++ forbids
>   declaration of `size' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:123: warning: ISO C++ forbids
>   initialization of member `size'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:123: warning: making `size' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:123: error: invalid in-class
>   initialization of static data member of non-integral type `int[0]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:124: warning: ISO C++ forbids
>   declaration of `size' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:124: warning: ISO C++ forbids
>   initialization of member `size'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:124: warning: making `size' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:124: error: invalid in-class
>   initialization of static data member of non-integral type `int[1]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:125: warning: ISO C++ forbids
>   declaration of `size' with no type
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:125: warning: ISO C++ forbids
>   initialization of member `size'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:125: warning: making `size' static
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:125: error: invalid in-class
>   initialization of static data member of non-integral type `int[2]'
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:129: error: syntax error before `.'
>   token
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:130: error: syntax error before `.'
>   token
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx: In member function `virtual void
>   CommandIterationUpdate::Execute(const itk::Object*, const
> itk::EventObject&)
>   ':
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:146: warning: passing `const
>   itk::MattesMutualInformationImageToImageMetric<itk::Image<float, 3>,
>   itk::Image<float, 3> >' as `this' argument of `void
>   itk::ImageToImageMetric<TFixedImage,
>   TMovingImage>::SetFixedImageRegion(typename TFixedImage::RegionType) [with
>   TFixedImage = itk::Image<float, 3>, TMovingImage = itk::Image<float, 3>]'
>   discards qualifiers
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:147: error: `numberOfSamples'
>   undeclared (first use this function)
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:147: error: (Each undeclared
>   identifier is reported only once for each function it appears in.)
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:148: warning: passing `const
>   itk::MattesMutualInformationImageToImageMetric<itk::Image<float, 3>,
>   itk::Image<float, 3> >' as `this' argument of `void
>   itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>   TMovingImage>::SetNumberOfHistogramBins(long unsigned int) [with
> TFixedImage
>   = itk::Image<float, 3>, TMovingImage = itk::Image<float, 3>]' discards
>   qualifiers
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:149: warning: passing `const
>   itk::MattesMutualInformationImageToImageMetric<itk::Image<float, 3>,
>   itk::Image<float, 3> >' as `this' argument of `void
>   itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>   TMovingImage>::SetUseExplicitPDFDerivatives(bool) [with TFixedImage =
>   itk::Image<float, 3>, TMovingImage = itk::Image<float, 3>]' discards
>   qualifiers
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:150: warning: passing `const
>   itk::MattesMutualInformationImageToImageMetric<itk::Image<float, 3>,
>   itk::Image<float, 3> >' as `this' argument of `void
>   itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>   TMovingImage>::SetUseCachingOfBSplineWeights(bool) [with TFixedImage =
>   itk::Image<float, 3>, TMovingImage = itk::Image<float, 3>]' discards
>   qualifiers
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:151: warning: passing `const
>   itk::MattesMutualInformationImageToImageMetric<itk::Image<float, 3>,
>   itk::Image<float, 3> >' as `this' argument of `void
>   itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>   TMovingImage>::SetUseAllPixels(bool) [with TFixedImage = itk::Image<float,
>   3>, TMovingImage = itk::Image<float, 3>]' discards qualifiers
> /Users/fabbri/Code/BSpline_MMI_RSG_2.cxx:152: error: no matching function
> for
>   call to `itk::MattesMutualInformationImageToImageMetric<itk::Image<float,
>   3>, itk::Image<float, 3> >::GetValue() const'
> /Users/fabbri/InsightToolkit-
> 3.10.0/Code/Algorithms/itkMattesMutualInformationImageToImageMetric.txx:696:
> error: candidates
>   are: typename itk::ImageToImageMetric<TFixedImage,
>   TMovingImage>::MeasureType
>   itk::MattesMutualInformationImageToImageMetric<TFixedImage,
>   TMovingImage>::GetValue(typename itk::ImageToImageMetric<TFixedImage,
>   TMovingImage>::ParametersType&) const [with TFixedImage =
> itk::Image<float,
>   3>, TMovingImage = itk::Image<float, 3>]
> make[2]: *** [CMakeFiles/BSpline_MMI_RSG_2.dir/BSpline_MMI_RSG_2.o] Error 1
> make[1]: *** [CMakeFiles/BSpline_MMI_RSG_2.dir/all] Error 2
> make: *** [all] Error 2
>
>
>
>
> On Mon, 23 Nov 2009, Karthik Krishnan wrote:
>
>> Nothing prevents you from instantiating a separate metric and setting
>> the fixed and moving images on it and calling GetValue() yourself. You
>> don't need to always drive it from an optimizer (although that is the
>> typical use case).
>>
>> You could place this code in your observer. Your instantiated Mattes
>> metric would use all samples (see the option on the metric). Also set
>> the transform at the current iteration on the metric.
>>
>> You may prefer to use itkMutualInformationHistogramImageToImageMetric
>> . There is no sampling, smoothing with a kernel function etc, if you
>> plan to use every single voxel.
>>
>>
>>
>> On Mon, Nov 23, 2009 at 7:34 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 (Non Rigid Registration).
>>> I want use all images for metric calculation but I'd like to know the
>>> value
>>> of the MI in a particular region of the my fixed image.
>>> I think that SetFixedRegion and SetFixedImageMask are not useful for my
>>> task
>>> because they restrict the MI calculation to the specified region. am I
>>> wrong?
>>> any suggestion?
>>>
>>> Thank you.
>>> Serena.
>>>
>>> _____________________________________
>>> 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
>>>
>>
>>
>>
>> --
>> _________________________________
>> Karthik Krishnan
>> R&D Engineer,
>> Kitware Inc.
>>
>
>
> _____________________________________
> 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