13 #include <itkLinearInterpolateImageFunction.h> 14 #include <itkNearestNeighborInterpolateImageFunction.h> 15 #include <itkPolyLineParametricPath.h> 16 #include <itkWindowedSincInterpolateImageFunction.h> 28 switch (image->GetDimension())
52 if (image->GetDimension() == 4)
54 mitkThrow() <<
"computation of intensity profiles not supported for 4D images";
57 IntensityProfile::Pointer intensityProfile = IntensityProfile::New();
58 itk::PolyLineParametricPath<3>::InputType input = path->StartOfInput();
60 const PixelType pixelType = image->GetPixelType();
62 IntensityProfile::MeasurementVectorType measurementVector;
63 itk::PolyLineParametricPath<3>::OffsetType
offset;
69 imageGeometry->
IndexToWorld(path->Evaluate(input), worldPoint);
73 intensityProfile->PushBack(measurementVector);
75 offset = path->IncrementInput(input);
76 }
while ((offset[0] | offset[1] | offset[2]) != 0);
78 return intensityProfile;
81 template <
class TInputImage>
87 return itk::NearestNeighborInterpolateImageFunction<TInputImage>::New().GetPointer();
90 return itk::LinearInterpolateImageFunction<TInputImage>::New().GetPointer();
93 return itk::WindowedSincInterpolateImageFunction<TInputImage, 3, itk::Function::BlackmanWindowFunction<3> >::New().GetPointer();
96 return itk::WindowedSincInterpolateImageFunction<TInputImage, 4, itk::Function::BlackmanWindowFunction<4> >::New().GetPointer();
99 return itk::WindowedSincInterpolateImageFunction<TInputImage, 5, itk::Function::BlackmanWindowFunction<5> >::New().GetPointer();
102 return itk::WindowedSincInterpolateImageFunction<TInputImage, 3, itk::Function::CosineWindowFunction<3> >::New().GetPointer();
105 return itk::WindowedSincInterpolateImageFunction<TInputImage, 4, itk::Function::CosineWindowFunction<4> >::New().GetPointer();
108 return itk::WindowedSincInterpolateImageFunction<TInputImage, 5, itk::Function::CosineWindowFunction<5> >::New().GetPointer();
111 return itk::WindowedSincInterpolateImageFunction<TInputImage, 3, itk::Function::HammingWindowFunction<3> >::New().GetPointer();
114 return itk::WindowedSincInterpolateImageFunction<TInputImage, 4, itk::Function::HammingWindowFunction<4> >::New().GetPointer();
117 return itk::WindowedSincInterpolateImageFunction<TInputImage, 5, itk::Function::HammingWindowFunction<5> >::New().GetPointer();
120 return itk::WindowedSincInterpolateImageFunction<TInputImage, 3, itk::Function::LanczosWindowFunction<3> >::New().GetPointer();
123 return itk::WindowedSincInterpolateImageFunction<TInputImage, 4, itk::Function::LanczosWindowFunction<4> >::New().GetPointer();
126 return itk::WindowedSincInterpolateImageFunction<TInputImage, 5, itk::Function::LanczosWindowFunction<5> >::New().GetPointer();
129 return itk::WindowedSincInterpolateImageFunction<TInputImage, 3, itk::Function::WelchWindowFunction<3> >::New().GetPointer();
132 return itk::WindowedSincInterpolateImageFunction<TInputImage, 4, itk::Function::WelchWindowFunction<4> >::New().GetPointer();
135 return itk::WindowedSincInterpolateImageFunction<TInputImage, 5, itk::Function::WelchWindowFunction<5> >::New().GetPointer();
138 return itk::NearestNeighborInterpolateImageFunction<TInputImage>::New().GetPointer();
142 template <
class TPixel,
unsigned int VImageDimension>
145 typename itk::InterpolateImageFunction<itk::Image<TPixel, VImageDimension> >::Pointer interpolateImageFunction = CreateInterpolateImageFunction<itk::Image<TPixel, VImageDimension> >(interpolator);
146 interpolateImageFunction->SetInputImage(image);
148 const itk::PolyLineParametricPath<3>::InputType startOfInput = path->StartOfInput();
149 const itk::PolyLineParametricPath<3>::InputType delta = 1.0 / (numSamples - 1);
151 IntensityProfile::MeasurementVectorType measurementVector;
153 for (
unsigned int i = 0; i < numSamples; ++i)
155 measurementVector[0] = interpolateImageFunction->EvaluateAtContinuousIndex(path->Evaluate(startOfInput + i * delta));
156 intensityProfile->PushBack(measurementVector);
162 IntensityProfile::Pointer intensityProfile = IntensityProfile::New();
164 return intensityProfile;
167 class AddPolyLineElementToPath
170 AddPolyLineElementToPath(
const PlaneGeometry* planarFigureGeometry,
const BaseGeometry* imageGeometry, itk::PolyLineParametricPath<3>::Pointer path)
171 : m_PlanarFigureGeometry(planarFigureGeometry),
172 m_ImageGeometry(imageGeometry),
179 m_PlanarFigureGeometry->Map(polyLineElement, m_WorldPoint);
180 m_ImageGeometry->WorldToIndex(m_WorldPoint, m_ContinuousIndexPoint);
181 m_Vertex.CastFrom(m_ContinuousIndexPoint);
182 m_Path->AddVertex(m_Vertex);
188 itk::PolyLineParametricPath<3>::Pointer m_Path;
191 Point3D m_ContinuousIndexPoint;
192 itk::PolyLineParametricPath<3>::ContinuousIndexType m_Vertex;
197 itk::PolyLineParametricPath<3>::Pointer path = itk::PolyLineParametricPath<3>::New();
200 std::for_each(polyLine.begin(), polyLine.end(),
201 AddPolyLineElementToPath(planarFigure->
GetPlaneGeometry(), imageGeometry, path));
209 imageGeometry->
WorldToIndex(point, continuousIndexPoint);
211 itk::PolyLineParametricPath<3>::ContinuousIndexType vertex;
212 vertex.CastFrom(continuousIndexPoint);
214 path->AddVertex(vertex);
219 itk::PolyLineParametricPath<3>::Pointer path = itk::PolyLineParametricPath<3>::New();
245 IntensityProfile::InstanceIdentifier maxIndex = 0;
247 IntensityProfile::ConstIterator end = intensityProfile->End();
248 IntensityProfile::MeasurementType measurement;
250 for (IntensityProfile::ConstIterator it = intensityProfile->Begin(); it != end; ++it)
252 measurement = it.GetMeasurementVector()[0];
254 if (measurement > max)
257 maxIndex = it.GetInstanceIdentifier();
267 IntensityProfile::InstanceIdentifier minIndex = 0;
269 IntensityProfile::ConstIterator end = intensityProfile->End();
270 IntensityProfile::MeasurementType measurement;
272 for (IntensityProfile::ConstIterator it = intensityProfile->Begin(); it != end; ++it)
274 measurement = it.GetMeasurementVector()[0];
276 if (measurement < min)
279 minIndex = it.GetInstanceIdentifier();
289 IntensityProfile::MeasurementType
min;
291 const IntensityProfile::InstanceIdentifier areaWidth = 1 + 2 * radius;
293 IntensityProfile::MeasurementType maxArea = 0;
295 for (IntensityProfile::InstanceIdentifier i = 0; i < areaWidth; ++i)
296 maxArea += intensityProfile->GetMeasurementVector(i)[0] -
min;
298 const IntensityProfile::InstanceIdentifier lastIndex = intensityProfile->Size() - areaWidth;
299 IntensityProfile::InstanceIdentifier centerOfMaxArea = radius;
300 IntensityProfile::MeasurementType area = maxArea;
302 for (IntensityProfile::InstanceIdentifier i = 1; i <= lastIndex; ++i)
304 area += intensityProfile->GetMeasurementVector(i + areaWidth - 1)[0] -
min;
305 area -= intensityProfile->GetMeasurementVector(i - 1)[0] -
min;
310 centerOfMaxArea = i + radius;
314 return centerOfMaxArea;
319 std::vector<IntensityProfile::MeasurementType> result;
320 result.reserve(intensityProfile->Size());
322 IntensityProfile::ConstIterator end = intensityProfile->End();
324 for (IntensityProfile::ConstIterator it = intensityProfile->Begin(); it != end; ++it)
325 result.push_back(it.GetMeasurementVector()[0]);
332 const IntensityProfile::InstanceIdentifier size = vector.size();
334 IntensityProfile::Pointer result = IntensityProfile::New();
335 result->Resize(size);
337 for (IntensityProfile::InstanceIdentifier i = 0; i < size; ++i)
338 result->SetMeasurement(i, 0, vector[i]);
345 typedef std::vector<IntensityProfile::MeasurementType> StatsVecType;
349 IntensityProfile::MeasurementType
min;
350 IntensityProfile::MeasurementType
max;
357 for ( StatsVecType::const_iterator it = statsVec.begin(); it != statsVec.end(); ++it )
363 mean /=
static_cast<double>(numSamples);
364 rms /=
static_cast<double>(numSamples);
367 for ( StatsVecType::const_iterator it = statsVec.begin(); it != statsVec.end(); ++it )
369 double diff = *it - mean;
372 var /= (
static_cast<double>(numSamples) - 1 );
void IndexToWorld(const mitk::Vector3D &vec_units, mitk::Vector3D &vec_mm) const
Convert (continuous or discrete) index coordinates of a vector vec_units to world coordinates (in mm)...
static const std::string NUMBEROFVOXELS()
Gives locked and index-based read access for a particular image part. The class provides several set-...
MITKIMAGESTATISTICS_EXPORT IntensityProfile::Pointer ComputeIntensityProfile(Image::Pointer image, PlanarFigure::Pointer planarFigure)
Compute intensity profile of an image for each pixel along the first PolyLine of a given planar figur...
#define AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, va_tuple)
Access a mitk-image with known dimension by an itk-image with one or more parameters.
MITKIMAGESTATISTICS_EXPORT IntensityProfile::InstanceIdentifier ComputeCenterOfMaximumArea(IntensityProfile::ConstPointer intensityProfile, IntensityProfile::InstanceIdentifier radius)
Compute center of maximum area under the curve of an intensity profile.
const TPixel & GetPixelByIndex(const itk::Index< VDimension > &idx) const
static IntensityProfile::Pointer ComputeIntensityProfile(Image::Pointer image, itk::PolyLineParametricPath< 3 >::Pointer path)
static itk::PolyLineParametricPath< 3 >::Pointer CreatePathFromPlanarFigure(BaseGeometry *imageGeometry, PlanarFigure *planarFigure)
DataCollection - Class to facilitate loading/accessing structured data.
MITKIMAGESTATISTICS_EXPORT IntensityProfile::InstanceIdentifier ComputeGlobalMaximum(IntensityProfile::ConstPointer intensityProfile, IntensityProfile::MeasurementType &max)
Compute global maximum of an intensity profile.
void AddStatistic(const std::string &key, StatisticsVariantType value)
Adds a statistic to the statistics object.
static void AddPointToPath(const BaseGeometry *imageGeometry, const Point3D &point, itk::PolyLineParametricPath< 3 >::Pointer path)
static const std::string VARIANCE()
static const std::string RMS()
MITKIMAGESTATISTICS_EXPORT std::vector< IntensityProfile::MeasurementType > CreateVectorFromIntensityProfile(IntensityProfile::ConstPointer intensityProfile)
Convert an intensity profile to a standard library vector.
MITKIMAGESTATISTICS_EXPORT IntensityProfile::InstanceIdentifier ComputeGlobalMinimum(IntensityProfile::ConstPointer intensityProfile, IntensityProfile::MeasurementType &min)
Compute global minimum of an intensity profile.
static itk::PolyLineParametricPath< 3 >::Pointer CreatePathFromPoints(BaseGeometry *imageGeometry, const Point3D &startPoint, const Point3D &endPoint)
#define mitkPixelTypeMultiplex3(function, ptype, param1, param2, param3)
MITKIMAGESTATISTICS_EXPORT IntensityProfile::Pointer CreateIntensityProfileFromVector(const std::vector< IntensityProfile::MeasurementType > &vector)
Convert a standard library vector to an intensity profile.
static const std::string MINIMUM()
mitk::Image::Pointer image
void WorldToIndex(const mitk::Point3D &pt_mm, mitk::Point3D &pt_units) const
Convert world coordinates (in mm) of a point to (continuous!) index coordinates.
static const std::string STANDARDDEVIATION()
MITKIMAGESTATISTICS_EXPORT void ComputeIntensityProfileStatistics(IntensityProfile::ConstPointer intensityProfile, ImageStatisticsContainer::ImageStatisticsObject &stats)
Compute statistics of an intensity profile.
static const std::string MAXIMUM()
unsigned long VoxelCountType
Describes a two-dimensional, rectangular plane.
static void ReadPixel(const PixelType &, Image::Pointer image, const itk::Index< 3 > &index, ScalarType *returnValue)
Container class for storing the computed image statistics.
static itk::InterpolateImageFunction< TInputImage >::Pointer CreateInterpolateImageFunction(InterpolateImageFunction::Enum interpolator)
static const std::string MEAN()
BaseGeometry Describes the geometry of a data object.
Class for defining the data type of pixels.