15 #include "mitkCalculateGrayValueStatisticsTool.xpm" 24 #include <itkCommand.h> 26 #include <itkHistogram.h> 43 return mitkCalculateGrayValueStatisticsTool_xpm;
53 return "No statistics generated for these segmentations:";
59 m_CompleteReport.str(
"");
70 DataNode *referencenode = m_ToolManager->GetReferenceData(0);
79 std::string nodename(
"structure");
82 std::string message =
"Calculating statistics for ";
90 m_CompleteReport <<
"======== Gray value analysis of " << nodename <<
" ========\n";
92 if (image.IsNotNull() && refImage.IsNotNull())
94 for (
unsigned int timeStep = 0; timeStep < image->GetTimeSteps(); ++timeStep)
97 timeSelector->SetInput(refImage);
98 timeSelector->SetTimeNr(timeStep);
99 timeSelector->UpdateLargestPossibleRegion();
103 timeSelector2->SetInput(image);
104 timeSelector2->SetTimeNr(timeStep);
105 timeSelector2->UpdateLargestPossibleRegion();
108 if (image3D.IsNotNull() && refImage3D.IsNotNull())
110 m_CompleteReport <<
"=== " << nodename <<
", time step " << timeStep <<
" ===\n";
116 m_CompleteReport <<
"======== End of analysis for " << nodename <<
" ===========\n\n\n";
134 StatisticsCompleted.Send();
138 #define ROUND_P(x) ((int)((x) + 0.5)) 140 template <
typename TPixel,
unsigned int VImageDimension>
146 typedef itk::Image<TPixel, VImageDimension>
ImageType;
147 typedef itk::Image<Tool::DefaultSegmentationDataType, VImageDimension> SegmentationType;
149 typename SegmentationType::Pointer segmentationItk;
152 typename SegmentationType::RegionType segmentationRegion = segmentationItk->GetLargestPossibleRegion();
154 segmentationRegion.Crop(referenceImage->GetLargestPossibleRegion());
156 itk::ImageRegionConstIteratorWithIndex<SegmentationType> segmentationIterator(segmentationItk, segmentationRegion);
157 itk::ImageRegionConstIteratorWithIndex<ImageType> referenceIterator(referenceImage, segmentationRegion);
159 segmentationIterator.GoToBegin();
160 referenceIterator.GoToBegin();
165 while (!segmentationIterator.IsAtEnd())
167 itk::Point<float, 3> pt;
168 segmentationItk->TransformIndexToPhysicalPoint(segmentationIterator.GetIndex(), pt);
170 typename ImageType::IndexType ind;
171 itk::ContinuousIndex<float, 3> contInd;
172 if (referenceImage->TransformPhysicalPointToContinuousIndex(pt, contInd))
174 for (
unsigned int i = 0; i < 3; ++i)
177 referenceIterator.SetIndex(ind);
179 if (segmentationIterator.Get() > 0)
181 if (referenceIterator.Get() < minimum)
182 minimum = referenceIterator.Get();
183 if (referenceIterator.Get() > maximum)
184 maximum = referenceIterator.Get();
188 ++segmentationIterator;
192 template <
typename TPixel,
unsigned int VImageDimension>
195 std::stringstream &report)
197 typedef itk::Image<TPixel, VImageDimension>
ImageType;
198 typedef itk::Image<Tool::DefaultSegmentationDataType, VImageDimension> SegmentationType;
200 typename SegmentationType::Pointer segmentationItk;
204 typename SegmentationType::RegionType segmentationRegion = segmentationItk->GetLargestPossibleRegion();
206 segmentationRegion.Crop(referenceImage->GetLargestPossibleRegion());
208 itk::ImageRegionConstIteratorWithIndex<SegmentationType> segmentationIterator(segmentationItk, segmentationRegion);
209 itk::ImageRegionConstIteratorWithIndex<ImageType> referenceIterator(referenceImage, segmentationRegion);
211 segmentationIterator.GoToBegin();
212 referenceIterator.GoToBegin();
214 m_ITKHistogram = HistogramType::New();
219 CalculateMinMax(referenceImage, segmentation, minimum, maximum);
222 HistogramType::SizeType size;
223 #if defined(ITK_USE_REVIEW_STATISTICS) 226 typedef typename HistogramType::SizeType::SizeValueType HSizeValueType;
228 size.Fill(static_cast<HSizeValueType>(maximum - minimum + 1));
229 HistogramType::MeasurementVectorType lowerBound;
230 HistogramType::MeasurementVectorType upperBound;
231 lowerBound[0] = minimum;
232 upperBound[0] = maximum;
233 m_ITKHistogram->Initialize(size, lowerBound, upperBound);
237 double voxelCount(0.0);
240 while (!segmentationIterator.IsAtEnd())
242 itk::Point<float, 3> pt;
243 segmentationItk->TransformIndexToPhysicalPoint(segmentationIterator.GetIndex(), pt);
245 typename ImageType::IndexType ind;
246 itk::ContinuousIndex<float, 3> contInd;
247 if (referenceImage->TransformPhysicalPointToContinuousIndex(pt, contInd))
249 for (
unsigned int i = 0; i < 3; ++i)
252 referenceIterator.SetIndex(ind);
254 if (segmentationIterator.Get() > 0)
256 HistogramType::MeasurementVectorType currentMeasurementVector;
258 currentMeasurementVector[0] =
static_cast<HistogramType::MeasurementType
>(referenceIterator.Get());
259 m_ITKHistogram->IncreaseFrequencyOfMeasurement(currentMeasurementVector, 1);
261 mean = (mean * (
static_cast<double>(voxelCount) /
262 static_cast<double>(voxelCount + 1)))
263 +
static_cast<double>(referenceIterator.Get()) / static_cast<double>(voxelCount + 1);
269 ++segmentationIterator;
273 segmentationIterator.GoToBegin();
274 referenceIterator.GoToBegin();
275 while (!segmentationIterator.IsAtEnd())
277 itk::Point<float, 3> pt;
278 segmentationItk->TransformIndexToPhysicalPoint(segmentationIterator.GetIndex(), pt);
280 typename ImageType::IndexType ind;
281 itk::ContinuousIndex<float, 3> contInd;
282 if (referenceImage->TransformPhysicalPointToContinuousIndex(pt, contInd))
284 for (
unsigned int i = 0; i < 3; ++i)
287 referenceIterator.SetIndex(ind);
289 if (segmentationIterator.Get() > 0)
291 sd += ((
static_cast<double>(referenceIterator.Get()) - mean) *
292 (
static_cast<double>(referenceIterator.Get()) - mean));
296 ++segmentationIterator;
299 sd /=
static_cast<double>(voxelCount - 1);
303 TPixel histogramQuantileValues[5];
304 histogramQuantileValues[0] = m_ITKHistogram->Quantile(0, 0.05);
305 histogramQuantileValues[1] = m_ITKHistogram->Quantile(0, 0.25);
306 histogramQuantileValues[2] = m_ITKHistogram->Quantile(0, 0.50);
307 histogramQuantileValues[3] = m_ITKHistogram->Quantile(0, 0.75);
308 histogramQuantileValues[4] = m_ITKHistogram->Quantile(0, 0.95);
312 std::locale originalLocale = report.getloc();
315 report <<
" Minimum:" << minimum <<
"\n 5% quantile: " << histogramQuantileValues[0]
316 <<
"\n 25% quantile: " << histogramQuantileValues[1] <<
"\n 50% quantile: " << histogramQuantileValues[2]
317 <<
"\n 75% quantile: " << histogramQuantileValues[3] <<
"\n 95% quantile: " << histogramQuantileValues[4]
318 <<
"\n Maximum: " << maximum <<
"\n Mean: " << mean <<
"\n SD: " << sd <<
"\n";
320 report.imbue(originalLocale);
325 return m_CompleteReport.str();
328 mitk::CalculateGrayValueStatisticsTool::HistogramType::ConstPointer
331 return m_ITKHistogram.GetPointer();
void Progress(unsigned int steps=1)
Sets the current amount of progress to current progress + steps.
itk::Image< unsigned char, 3 > ImageType
#define MITKSEGMENTATION_EXPORT
DataCollection - Class to facilitate loading/accessing structured data.
static ProgressBar * GetInstance()
static method to get the GUI dependent ProgressBar-instance so the methods for steps to do and progre...
MITK_TOOL_MACRO(MITKSEGMENTATION_EXPORT, LiveWireTool2D, "LiveWire tool")
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
#define AccessFixedDimensionByItk_2(mitkImage, itkImageTypeFunction, dimension, arg1, arg2)
void DisplayText(const char *t)
Send a string to the applications StatusBar.
ValueType
Type of the value held by a Value object.
Image class for storing images.
mitk::Image::Pointer image
static StatusBar * GetInstance()
static method to get the GUI dependent StatusBar-instance so the methods DisplayText, etc. can be called No reference counting, cause of decentral static use!
void AddStepsToDo(unsigned int steps)
Adds steps to totalSteps.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
Class for nodes of the DataTree.
bool GetName(std::string &nodeName, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="name") const
Convenience access method for accessing the name of an object (instance of StringProperty with proper...