17 #ifndef __itkScalarImageTextureCalculator_txx
18 #define __itkScalarImageTextureCalculator_txx
22 #include "vnl/vnl_math.h"
25 namespace Statistics {
27 template<
class TImage,
class THistogramFrequencyContainer >
31 m_GLCMGenerator = GLCMGeneratorType::New();
32 m_FeatureMeans = FeatureValueVector::New();
33 m_FeatureStandardDeviations = FeatureValueVector::New();
39 requestedFeatures->push_back(
Energy);
40 requestedFeatures->push_back(
Entropy);
42 requestedFeatures->push_back(
Inertia);
45 this->SetRequestedFeatures(requestedFeatures);
51 ImageType >::ImageDimension > NeighborhoodType;
52 NeighborhoodType hood;
57 unsigned int centerIndex = hood.GetCenterNeighborhoodIndex();
60 for (
unsigned int d=0; d < centerIndex; d++)
62 offset = hood.GetOffset(d);
63 offsets->push_back(offset);
65 this->SetOffsets(offsets);
66 m_FastCalculations =
false;
69 template<
class TImage,
class THistogramFrequencyContainer >
74 if (m_FastCalculations)
84 template<
class TImage,
class THistogramFrequencyContainer >
89 int numOffsets = m_Offsets->size();
90 int numFeatures = m_RequestedFeatures->size();
93 features =
new double *[numOffsets];
94 for (
int i = 0; i < numOffsets; i++)
96 features[i] =
new double [numFeatures];
101 int offsetNum, featureNum;
103 for(offsetIt = m_Offsets->Begin(), offsetNum = 0;
104 offsetIt != m_Offsets->End(); offsetIt++, offsetNum++)
106 m_GLCMGenerator->SetOffset(offsetIt.
Value());
107 m_GLCMGenerator->Compute();
109 glcmCalc->SetHistogram(m_GLCMGenerator->GetOutput());
113 for(fnameIt = m_RequestedFeatures->Begin(), featureNum = 0;
114 fnameIt != m_RequestedFeatures->End(); fnameIt++, featureNum++)
116 features[offsetNum][featureNum] = glcmCalc->GetFeature(fnameIt.
Value());
121 m_FeatureMeans->clear();
122 m_FeatureStandardDeviations->clear();
123 double *tempFeatureMeans =
new double [numFeatures];
124 double *tempFeatureDevs =
new double [numFeatures];
137 for (featureNum = 0; featureNum < numFeatures; featureNum++)
139 tempFeatureMeans[featureNum] = features[0][featureNum];
140 tempFeatureDevs[featureNum] = 0;
143 for (offsetNum = 1; offsetNum < numOffsets; offsetNum++)
145 int k = offsetNum + 1;
146 for (featureNum = 0; featureNum < numFeatures; featureNum++)
148 double M_k_minus_1 = tempFeatureMeans[featureNum];
149 double S_k_minus_1 = tempFeatureDevs[featureNum];
150 double x_k = features[offsetNum][featureNum];
152 double M_k = M_k_minus_1 + (x_k - M_k_minus_1) / k;
153 double S_k = S_k_minus_1 + (x_k - M_k_minus_1) * (x_k - M_k);
155 tempFeatureMeans[featureNum] = M_k;
156 tempFeatureDevs[featureNum] = S_k;
159 for (featureNum = 0; featureNum < numFeatures; featureNum++)
161 tempFeatureDevs[featureNum] = vcl_sqrt(tempFeatureDevs[featureNum] / numOffsets);
163 m_FeatureMeans->push_back(tempFeatureMeans[featureNum]);
164 m_FeatureStandardDeviations->push_back(tempFeatureDevs[featureNum]);
166 delete [] tempFeatureMeans;
167 delete [] tempFeatureDevs;
168 for(
int i=0; i < numOffsets; i++)
170 delete [] features[i];
175 template<
class TImage,
class THistogramFrequencyContainer >
182 for(offsetIt = m_Offsets->Begin(); offsetIt != m_Offsets->End(); offsetIt++)
184 m_GLCMGenerator->SetOffset(offsetIt.
Value());
187 m_GLCMGenerator->Compute();
189 glcmCalc->SetHistogram(m_GLCMGenerator->GetOutput());
192 m_FeatureMeans->clear();
193 m_FeatureStandardDeviations->clear();
195 for(fnameIt = m_RequestedFeatures->Begin();
196 fnameIt != m_RequestedFeatures->End(); fnameIt++)
198 m_FeatureMeans->push_back(glcmCalc->GetFeature(fnameIt.
Value()));
199 m_FeatureStandardDeviations->push_back(0.0);
204 template<
class TImage,
class THistogramFrequencyContainer >
209 itkDebugMacro(
"setting Input to " << inputImage);
210 m_GLCMGenerator->SetInput(inputImage);
214 template<
class TImage,
class THistogramFrequencyContainer >
219 itkDebugMacro(
"setting NumberOfBinsPerAxis to " << numberOfBins);
220 m_GLCMGenerator->SetNumberOfBinsPerAxis(numberOfBins);
224 template<
class TImage,
class THistogramFrequencyContainer >
229 itkDebugMacro(
"setting Min to " << min <<
"and Max to " << max);
230 m_GLCMGenerator->SetPixelValueMinMax(min, max);
234 template<
class TImage,
class THistogramFrequencyContainer >
239 itkDebugMacro(
"setting ImageMask to " << imageMask);
240 m_GLCMGenerator->SetImageMask(imageMask);
244 template<
class TImage,
class THistogramFrequencyContainer >
249 itkDebugMacro(
"setting InsidePixelValue to " << insidePixelValue);
250 m_GLCMGenerator->SetInsidePixelValue(insidePixelValue);
254 template<
class TImage,
class THistogramFrequencyContainer >
259 Superclass::PrintSelf(os,indent);