23 #include <itkLabelStatisticsImageFilter.h> 24 #include <itkNeighborhoodIterator.h> 27 #include <vtkSmartPointer.h> 28 #include <vtkImageMarchingCubes.h> 29 #include <vtkCurvatures.h> 30 #include <vtkPointData.h> 38 int size = scalars->GetNumberOfTuples();
40 double maximum = std::numeric_limits<double>::lowest();
53 int countPositive = 0;
54 int countNegative = 0;
56 for (
int i = 0; i < size; ++i)
58 double actualValue = scalars->GetComponent(i, 0);
59 minimum = std::min<double>(minimum, scalars->GetComponent(i, 0));
60 maximum = std::max<double>(maximum, scalars->GetComponent(i, 0));
62 mean2 += actualValue*actualValue;
63 mean3 += actualValue*actualValue*actualValue;
64 mean4 += actualValue*actualValue*actualValue*actualValue;
67 mean1p += actualValue;
68 mean2p += actualValue*actualValue;
69 mean3p += actualValue*actualValue*actualValue;
70 mean4p += actualValue*actualValue*actualValue*actualValue;
75 mean1n += actualValue;
76 mean2n += actualValue*actualValue;
77 mean3n += actualValue*actualValue*actualValue;
78 mean4n += actualValue*actualValue*actualValue*actualValue;
82 double mean = mean1 / size;
83 double stddev = std::sqrt(mean2 / size - mean*mean);
84 double skewness = ((mean3 / size) - 3 * mean*stddev*stddev - mean*mean*mean) / (stddev*stddev*stddev);
86 double meanP = mean1p / countPositive;
87 double stddevP = std::sqrt(mean2p / countPositive - meanP*meanP);
88 double skewnessP = ((mean3p / countPositive) - 3 * meanP*stddevP*stddevP - meanP*meanP*meanP) / (stddevP*stddevP*stddevP);
90 double meanN = mean1n / countNegative;
91 double stddevN = std::sqrt(mean2n / countNegative - meanN*meanN);
92 double skewnessN = ((mean3n / countNegative) - 3 * meanN*stddevN*stddevN - meanN*meanN*meanN) / (stddevN*stddevN*stddevN);
94 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Minimum " + name +
" Curvature", minimum));
95 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Maximum " + name +
" Curvature", maximum));
96 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Mean " + name +
" Curvature", mean));
97 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Standard Deviation " + name +
" Curvature", stddev));
98 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Skewness " + name +
" Curvature", skewness));
99 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Mean Positive " + name +
" Curvature", meanP));
100 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Standard Deviation Positive " + name +
" Curvature", stddevP));
101 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Skewness Positive " + name +
" Curvature", skewnessP));
102 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Mean Negative " + name +
" Curvature", meanN));
103 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Standard Deviation Negative " + name +
" Curvature", stddevN));
104 featureList.push_back(std::make_pair(featureDescriptionPrefix +
"Skewness Negative " + name +
" Curvature", skewnessN));
118 if (image->GetDimension() < 3)
123 vtkSmartPointer<vtkImageMarchingCubes> mesher = vtkSmartPointer<vtkImageMarchingCubes>::New();
124 vtkSmartPointer<vtkCurvatures> curvator = vtkSmartPointer<vtkCurvatures>::New();
125 mesher->SetInputData(mask->GetVtkImageData());
126 mesher->SetValue(0, 0.5);
127 curvator->SetInputConnection(mesher->GetOutputPort());
128 curvator->SetCurvatureTypeToMean();
130 vtkDataArray* scalars = curvator->GetOutput()->GetPointData()->GetScalars();
133 curvator->SetCurvatureTypeToGaussian();
135 scalars = curvator->GetOutput()->GetPointData()->GetScalars();
138 curvator->SetCurvatureTypeToMinimum();
140 scalars = curvator->GetOutput()->GetPointData()->GetScalars();
143 curvator->SetCurvatureTypeToMaximum();
145 scalars = curvator->GetOutput()->GetPointData()->GetScalars();
171 MITK_INFO <<
"Start calculating volumetric features ....";
173 featureList.insert(featureList.end(), localResults.begin(), localResults.end());
174 MITK_INFO <<
"Finished calculating volumetric features....";
std::vector< std::string > FeatureNameListType
virtual void SetLongName(std::string _arg)
void addArgument(const std::string &longarg, const std::string &shortarg, Type type, const std::string &argLabel, const std::string &argHelp=std::string(), const us::Any &defaultValue=us::Any(), bool optional=true, bool ignoreRest=false, bool deprecated=false, mitkCommandLineParser::Channel channel=mitkCommandLineParser::Channel::None)
virtual void SetShortName(std::string _arg)
std::vector< std::pair< std::string, double > > FeatureListType
std::string FeatureDescriptionPrefix()
Returns a string that encodes the feature class name.
FeatureListType CalculateFeatures(const Image::Pointer &image, const Image::Pointer &feature) override
Calculates the Cooccurence-Matrix based features for this class.
virtual std::string GetLongName() const
static void calculateLocalStatistic(vtkDataArray *scalars, std::string name, std::string featureDescriptionPrefix, mitk::GIFCurvatureStatistic::FeatureListType &featureList)
std::string GetOptionPrefix() const
FeatureNameListType GetFeatureNames() override
Returns a list of the names of all features that are calculated from this class.
mitk::Image::Pointer image
void CalculateFeaturesUsingParameters(const Image::Pointer &feature, const Image::Pointer &mask, const Image::Pointer &maskNoNAN, FeatureListType &featureList) override
Calculates the feature of this abstact interface. Does not necessarily considers the parameter settin...
virtual void SetFeatureClassName(std::string _arg)
mitk::Image::Pointer mask
void AddArguments(mitkCommandLineParser &parser) override
virtual ParameterTypes GetParameter() const