[Insight-developers] [Fwd: State of the ITK and VTK Integration into MeVisLab]

Stephen R. Aylward Stephen.Aylward at Kitware.com
Sun Mar 12 14:34:14 EST 2006


Just wanted to share someone's experience with integrating ITK into a 
larger package...

The email has an extensive list of bugs/inconsistencies.   Should I add 
them to the buglist?

Stephen

-------- Original Message --------
From: Wolf Spindler <wolf at mevis.de>

(SNIP)

1) State of integration
-----------------------
The integration is on a good way. Yesterday we
release MeVisLab 1.3 which also provides
AddOn-Installers for 274 ITK modules and 643 VTK
modules. The all can be combined interactively
with all modules from the entire OpenInventor Library,
all image processing modules in MeVisLab and a package
of macro modules in MeVisLab (all together more than
1200 modules!)
The ITK modules also include almost the complete
ITK registration framework.
It bases on the ITK 2.3 version of end of november.
Note that this stuff is completely free for use for
everyone. Juliens developer license provides full
and other free licenses limited MeVisLab development
features.  We also added a PublicSources installer containing
a number of sources from MeVisLab modules.

(SNIP)

5) Other things, especially our experiences with ITK.
-----------------------------------------------------
During the development of the code generators we
experienced a number of advantages and powerful
feature of ITK, and also a number of stuff we had
problems with.
Is it okay if I discuss some these experiences here?
First: It's great stuff! I really like that library and all
its feature (that's the reason why we integrate it :-)).
And we will be very happy to continue the integrations
in the future and to discuss further and more powerful
interfaces between both software packages.
This could also include e.g. the generation of interfaces
for scripting languages for ITK automatically by code
generators.

Second: The (automatic) integration already works quite
fine, although we found out a number of things we had
problems with.
During the improvements of the code generators and
the tests of the MeVisLab modules we collected a number
of hints, problems and even bugs. The list about that
might not be up to date any more, because ITK develops
rapidly; hence please don't be bothered if some stuff of
the list below is already fixed. I wanted to send this
list much earlier, but I can work only small parts of
my working time on that project, hence please apologize
again for the late notification.


-DiffusionTensor3DReconstructionImageFilter has the method
    void AddGradientImage( const GradientDirectionType &, const
GradientImageType *image);
  but no method to remove an added image. That requires
  reinstantiation of the filter instance to be able to change
  the gradient image.

-Internally gdcm uses SNMPAPI.LIB on VC6. It needs to be
  linked manually to make some files run (used in gdcmUtil.cxx)

-Filters derived from PadImageFilter:
  If image extents are increased and reach outside the requested
  output page extent then the remaining areas are not calculated
  correctly.

-I wonder whether it makes sense to compile sin, cos, tan, asin,
  acos, atan, sqrt etc. for non-floating point types, because they
  do not calculate sensible values then. It might be useful
  to avoid their compilation for non-floating point types by using
  checking traits.

-ApproximateSignedDistanceMapImageFilter seems not to work
  with images containing 0 values. It then always throws exceptions
  claiming that gradient norm is lower then pixel precision.
  Is that correct? This holds also if the filter is compiled
  with flowing point pixel types.

-CollidingFrontsImageFilter simply crashes if no, NULL or
  empty seed point list are passed. An error message,
  exception or fallback default seed points (e.g. in center
  of image or the origin) could solve that problem.

-VoronoiFilters also compile for 3D images although they
  work fine only on 2D. It would be nice to have a template
  trait check to make compilation for non-2D dimensions
  impossible.

-itkExpandImageFilter produces gaps in image for expand
  factors 5, 6.

-itkFlipImageFilter and itkReflectImageFilter do not request
  correct regions from input if flipping/reflecting
  requires regions outside the requested region.

-GetAverageSliceImageFilter uses exit(2) and terminates
  application in case of bad AveragedOutDimension instead
  of using standard exception handling => no chance of error
  handling by application by catching exceptions.
  A solutions could be to clamp parameters before they
  cause trouble.
  It also seems to return an incorrect largestPossible
  region, i.e. the region of the input image instead of
  a slice. I expected that many slices are projected to
  one slice? Is that mean by the word "Reflection" in the
  header documentation?
  (Maybe these problems are already fixed, something has
   changed on that filter in recent releases.)

-itkGradientRecursiveGaussianImageFilter.txx(37) "weight"
  is unused and causes many warnings, because this class is
  used in many derived classes.
  (Seems to be fixed)

-BSplineDeformableTransform crashes when calling GetParameters
  on just created instance. Not behaves like other transforms.
  Automatic wrapper generation suffers on that because default
  value requests do not work.
  A solution could be return an empty parameters object which
  returns number of parameters = 0.

-Rigid3DTransform
  Setting ParametersByValue with default instance values (which are empty)
  leads to crash, because of missing check for empty parameter array.

-CumulativeGaussianOptimizer does not send StartEvent, IterationEvent
  or EndEvent events during optimization.

-PDEDeformableRegistration / FiniteDifferenceImageFilter crash when used
  with unspecified difference function. An error message/exception would be
  desirable or a default function.

-MeanSquarePointSetToImageMetric and
  itkNormalizedCorrelationPointSetToImageMetric
  crash when fixedPointSet is set but empty. An error exception
  or a default fixedPointSet would be desirable.

-BinaryMinMaxCurvatureFlowImageFilter seems to request incorrect
  input regions if output region is not the largest possible region.
  At least on the output only the first region seems to be filtered.

-VnlFFTRealToComplexConjugateImageFilter calculates incorrect results if
  used with requested regions < image extents.

-VnlFFTComplexConjugateToRealImageFilter crashes if used with requested
  regions < image extents, because internqlly it uses entire image extents
  for fft.

-AnisotropicFourthOrderLevelSetImageFilter
  AntiAliasBinaryImageFilter
  CannySegmentationLevelSetImageFilter
  CheckerBoardImageFilter
  CollidingFrontsImageFilter
  ConfidenceConnectedImageFilter
  ConnectedThresholdImageFilter
  CurvatureAnisotropicDiffusionImageFilter
  CurvatureFlowImageFilter
  CurvesLevelSetImageFilter
  DanielssonDistanceMapImageFilter
  DifferenceOfGaussiansGradientImageFilter
  DoubleThresholdImagefilter
  ExtensionVelocitiesImageFilter
  FastChamferDistanceImageFilter
  FastMarchingImageFilter
  FastMarchingUpwindGradientImageFilter
  FlipImageFilter
  GeodesicActiveContourLevelSetImageFilter
  GetAverageSliceImageFilter
  GradientAnisotropicDiffusionImageFilter
  GradientRecursiveGaussianImageFilter
  GrayscaleFillholeImageFilter
  GrayscaleGrindPeakImageFilter
  HardConnectedComponentImageFilter
  HConcaveImageFilter
  HConvexImageFilter
  HMinimalImageFilter
  HMaximalImageFilter
  Hessian3DToVesselnessMeasureImageFilter
  HessianRecursiveGaussianImageFilter
  IsoContourDistanceImageFilter
  IsolatedWatershedImageFilter
  IsotropicFourthOrderLevelSetImageFilter
  GrayscaleConnectedClosingImageFilter
  GrayscaleConnectedOpeningImageFilter
  GrayscaleMorphologicalClosingImageFilter
  GrayscaleMorphologicalOpeningImageFilter
  GrayscaleMorphologicalImageFilter.xml
  KLMRegionGrowImageFilter
  HessianRecursiveGaussianImageFilter
  LaplacianSegmentationLevelSetImageFilter
  LazyEdgeDetectionImageFilter3D
  MinMaxCurvatureFlowImageFilter
  NeighborhoodConnectedImageFilter
  RecursiveGaussianImageFilter
  ReflectImageFilter
  RegionGrowImageFilter
  ReinitializeLevelSetImageFilter
  ShapeDetectionLevelSetImageFilter
  SignedDanielssonDistanceMapImageFilter
  ThresholdSegmentationLevelSetImageFilter
  TobogganImageFilter
  UnsharpMaskLevelSetImageFilter
  VectorConfidenceConnectedImageFilter
  VectorGradientAnisotropicDiffusionImageFilter
  VnlFFTRealToComplexConjugateImageFilter
  WatershedImageFilter
  produce different and/or invalid output images or even
  crash for requested regions which differ from largest
  possible region, i.e. it requires requested
  region == largest possible region to work correctly.

  Is it possible that this behaviour is not tested? About
  the third part of all algorithms which we integrated into
  MeVisLab seem to work inappropriately.

-ExtensionVelocitiesImageFilter seems not to work with integer
  pixel types. Maybe it should be suppressed by template traits
  or adapted for integer types.

-DoubleThresholdImageFilter: It calculates very slow and produces
  senseless results.

-MRFImageFilter simply crashes if used without specified
  classifier because of NULL-pointer usage. Error message,
  exception or fallback default classifier could solve that problem.

-IsoContourDistanceImageFilter: Simply crashes if narrowbanding is
  enabled but no narrow band is set. An exception for the missing
  parameter or a warning would be nice.

-NarrowBandLevelSetImageFilter: Deprecated function SetMaximumRMSError
  is called from constructor. Thus it is not possible to use this or
  derived filter classes without getting the deprecated warning from
  that function.

-IterativeInverseDeformationFieldImageFilter prints undesired
  debugging stuff into console.
  (Has recently changed, probably problem is already fixed).

-itkThresholdImageFilter: Does not use SetFunctions or Macros to specify
  threshold values.
  ThresholdAbove, ThresholdBelow, ThresholdOutSide have no "Set" in name.
  (Seems to be fixed in current version).

-RegionGrowImageFilter seems to be a base class which is not really
  functional as is. May be it could better have no New operator to
  force derivation to avoid usage of this class or to make requires
  methods pure virtual to force their overloading.
  (Seems to be fixed in current version).

-What happens in the itkSingleValuedNonLinearVnlOptimizer and derived
  classes if SetMaximize and SetMinimize are both activated? A comment
  would be desirable.

-Most of the following SetFunctions or SetMacros do not have
  corresponding GetFunctions or GetMacros, or they have
  GetFunctions with corresponding name but different type.
  Automatic wrapper generation suffers heavily on that, because
  requests for default or current state values of an instance
  are not possible. Please note that some of them already might
  be fixed or simply could be implemented in a base class.

   CannySegmentationLevelSetImageFilter::FeatureScaling
   ChangeInformationImageFilter::OutputOffset
   CollidingFrontsImageFilter::SeedPoints1
   CollidingFrontsImageFilter::SeedPoints2
   ConfidenceConnectedImageFilter::Seed
   ConnectedThresholdImageFilter::Seed
   ConstantPadImageFilter::PadLowerBound
   ConstantPadImageFilter::PadUpperBound
   CurvesLevelSetImageFilter::FeatureScaling
   ExpNegativeImageFilter::ExpandFactors
   ExpNegativeImageFilter::Factor
   ExpandImageFilter::ExpandFactors
   ExtensionVelocitiesImageFilter::NarrowBandwidth
   ExtensionVelocitiesImageFilter::InputNarrowBand
   ExtractOrthogonalSwath2DImageFilter::Size
   FastChamferDistanceImageFilter::Weights
   FastMarchingExtensionImageFilter::AlivePoints
   FastMarchingExtensionImageFilter::TrialPoints
   FastMarchingImageFilter::AlivePoints
   FastMarchingImageFilter::TrialPoints
   FastMarchingUpwindGradientImageFilter::AlivePoints
   FastMarchingUpwindGradientImageFilter::TrialPoints
   FastMarchingUpwindGradientImageFilter::TargetPoints
   FEMRegistrationFilter::LandmarkFile
   FEMRegistrationFilter::ResultsFile
   FEMRegistrationFilter::DisplacementsFile
   FEMRegistrationFilter::TimeStep
   FEMRegistrationFilter::EnergyReductionFactor
   FEMRegistrationFilter::LineSearchMaximumIterations
   FEMRegistrationFilter::Alpha
   FEMRegistrationFilter::NumLevels
   FEMRegistrationFilter::MaxLevels
   FEMRegistrationFilter::Temp
   GeodesicActiveContourLevelSetImageFilter::FeatureScaling
   GeodesicActiveContourShapePriorLevelSetImageFilter::FeatureScaling
   GetAverageSliceImageFilter::AveragedOutDimension
   GradientMagnitudeRecursiveGaussianImageFilter::Sigma
   GradientRecursiveGaussianImageFilter::Sigma
   HardConnectedComponentImageFilter::ObjectSeed
   HessianRecursiveGaussianImageFilter::Sigma
   HoughTransform2DCirclesImageFilter::MaximumRadius
   HoughTransform2DCirclesImageFilter::MinimumRadius
   HoughTransform2DCirclesImageFilter::Radius
   IsolatedConnectedImageFilter::Seed1
   IsolatedConnectedImageFilter::Seed2
   IsolatedWatershedImageFilter::Seed1
   IsolatedWatershedImageFilter::Seed2
   LaplacianRecursiveGaussianImageFilter::Sigma
   LaplacianSegmentationLevelSetImageFilter::FeatureScaling
   LazyEdgeDetectionImageFilter3D::EdgeDetectorThreshold
   LazyEdgeDetectionImageFilter3D::EdgeDetectorOutsideValue
   LazyEdgeDetectionImageFilter3D::EdgeDetectorVariance
   LazyEdgeDetectionImageFilter3D::EdgeDetectorMaximumError
   LevelSet* filter:UseNegativeFeaturesOn/Off
   MRIBiasFieldCorrectionFilter::SlicingDirection
   MRIBiasFieldCorrectionFilter::InitialBiasFieldCoefficients
   MRIBiasFieldCorrectionFilter::StartingShrinkFactors
   MaskImageFilter::OutsideValue
   MirrorPadImageFilter::PadLowerBound
   MirrorPadImageFilter::PadUpperBound
   MultiResolutionPyramidImageFilter::StartingShrinkFactors
   NarrowBandCurvesLevelSetImageFilter::FeatureScaling
   NarrowBandThresholdSegmentationLevelSetImageFilter::FeatureScaling
   NeighborhoodConnectedImageFilter::Seed
   NonThreadedShrinkImageFilter::ShrinkFactors
   PDEDeformableRegistrationFilter::StandardDeviations
   PDEDeformableRegistrationFilter::UpdateFieldStandardDeviations
   RecursiveMultiResolutionPyramidImageFilter::StartingShrinkFactors
   ReinitializeLevelSetImageFilter::NarrowBandwidth
   ReinitializeLevelSetImageFilter::InputNarrowBand
   SegmentationLevelSetImageFilter::FeatureScaling
   ShapeDetectionLevelSetImageFilter::FeatureScaling
   SigmoidImageFilter::Alpha
   SigmoidImageFilter::Beta
   SigmoidImageFilter::OutputMinimum
   SigmoidImageFilter::OutputMaximum
   SmoothingRecursiveGaussianImageFilter::Sigma
   SymmetricEigenAnalysisImageFilter::Dimension
   VectorConfidenceConnectedImageFilter::Seed
   VectorExpandImageFilter::ExpandFactors
   VectorExpandImageFilter::EdgePaddingValue
   VectorResampleImageFilter::DefaultPixelValue
   WarpVectorImageFilter::EdgePaddingValue

   WeightedAddImageFilter::Alpha
   WrapPadImageFilter::PadLowerBound
   WrapPadImageFilter::PadUpperBound

   # Functions
   BinaryMinMaxCurvatureFlowFunction::StencilRadius
   MinMaxCurvatureFlowFunction::StencilRadius
   GaussianDerivativeImageFunction::Sigma
   GaussianDerivativeImageFunction::Extent
   MIRegistrationFunction::MinNorm
   MIRegistrationFunction::DoInverse

   # Metrics
   CorrelationCoefficientHistogramImageToImageMetric::TransformParameters
   GradientDifferenceImageToImageMetric::TransformParameters
   KappaStatisticImageToImageMetric::TransformParameters
   KullbackLeiblerCompareHistogramImageToImageMetric::TransformParameters
   MatchCardinalityImageToImageMetric::TransformParameters
   MattesMutualInformationImageToImageMetric::TransformParameters
   MeanReciprocalSquareDifferenceImageToImageMetric::TransformParameters
   MeanSquaresHistogramImageToImageMetric::TransformParameters
   MeanSquaresImageToImageMetric::TransformParameters
   MeanSquaresPointSetToImageMetric::TransformParameters
   MutualInformationHistogramImageToImageMetric::TransformParameters
   MutualInformationImageToImageMetric::TransformParameters
   NormalizedCorrelationImageToImageMetric::TransformParameters
   NormalizedCorrelationPointSetToImageMetric::TransformParameters
 
NormalizedMutualInformationHistogramImageToImageMetric::TransformParameters

   MeanSquaresPointSetToImageMetric::FixedPointSet
   NormalizedCorrelationPointSetToImageMetric::FixedPointSet

   # Optimizers
   OnePlusOneEvolutionaryOptimizer::Maximize

   # Transforms
   AffineTransform::ParametersByValue
   AzimuthElevationToCartesianTransform::ForwardAzimuthElevationToCartesian
   AzimuthElevationToCartesianTransform::ForwardCartesianToAzimuthElevation
   AzimuthElevationToCartesianTransform::ParametersByValue
   AzimuthElevationToCartesianTransform::MaxAzimuth
   AzimuthElevationToCartesianTransform::MaxElevation
   AzimuthElevationToCartesianTransform::RadiusSampleSize
   AzimuthElevationToCartesianTransform::AzimuthAngularSeparation
   AzimuthElevationToCartesianTransform::ElevationAngularSeparation
   AzimuthElevationToCartesianTransform::FirstSampleDistance
   BSplineDeformableTransform::ParametersByValue
   CenteredAffineTransform::ParametersByValue
   CenteredEuler3DTransform::ParametersByValue
   CenteredRigid2DTransform::ParametersByValue
   CenteredSimilarity2DTransform::ParametersByValue
   ElasticBodyReciprocalSplineKernelTransform::ParametersByValue
   ElasticBodySplineKernelTransform::ParametersByValue
   Euler2DTransform::ParametersByValue
   Euler3DTransform::ParametersByValue
   FixedCenterOfRotationAffineTransform::ParametersByValue
   IdentityTransform::ParametersByValue
   QuaternionRigidTransform::ParametersByValue
   Rigid2DTransform::ParametersByValue
   Rigid3DTransform::ParametersByValue
   ScalableAffineTransform::ParametersByValue
   ScaleLogarithmicTransform::ParametersByValue
   ScaleSkewVersor3DTransform::ParametersByValue
   ScaleTransform::ParametersByValue
   Similarity2DTransform::ParametersByValue
   Similarity3DTransform::ParametersByValue
   ThinPlateR2LogRSplineKernelTransform::ParametersByValue
   ThinPlateSplineKernelTransform::ParametersByValue
   TranslationTransform::ParametersByValue
   VersorRigid3DTransform::ParametersByValue
   VersorTransform::ParametersByValue
   VolumeSplineKernelTransform::ParametersByValue

   Euler2DTransform::AngleInDegrees
   Euler2DTransform::Rotation
   Similarity2DTransform::AngleInDegrees

   CenteredRigid2DTransform::AngleInDegrees
   CenteredSimilarity2DTransform::AngleInDegrees
   ElasticBodyReciprocalSplineKernelTransform::SourceLandmarks
   ElasticBodyReciprocalSplineKernelTransform::TargetLandmarks
   ElasticBodySplineKernelTransform::SourceLandmarks
   ElasticBodySplineKernelTransform::TargetLandmarks
   ThinPlateR2LogRSplineKernelTransform::SourceLandmarks
   ThinPlateR2LogRSplineKernelTransform::TargetLandmarks
   ThinPlateSplineKernelTransform::SourceLandmarks
   ThinPlateSplineKernelTransform::TargetLandmarks
   VolumeSplineKernelTransform::SourceLandmarks
   VolumeSplineKernelTransform::TargetLandmarks





-- 
=============================================================
Stephen R. Aylward, Ph.D.
Chief Medical Scientist
Kitware, Inc.
http://www.kitware.com



More information about the Insight-developers mailing list