[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