Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkVolumeCalculator.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkImageRegionConstIterator.h>
00021
00022 template < typename TPixel, unsigned int VImageDimension >
00023 void mitk::VolumeCalculator::InternalCompute(itk::Image< TPixel, VImageDimension >* itkImage)
00024 {
00025 itk::ImageRegionConstIterator<itk::Image < TPixel, VImageDimension > > imageIt(itkImage, itkImage->GetLargestPossibleRegion() );
00026 unsigned long int count = 0;
00027
00028 for (imageIt.GoToBegin(); !imageIt.IsAtEnd(); ++imageIt)
00029 {
00030 if ( (int)(imageIt.Get()) >= m_Threshold )
00031 {
00032 count++;
00033 }
00034 }
00035 if (itkImage->GetLargestPossibleRegion().GetImageDimension() == 3)
00036 {
00037 m_Volume = count / 1000.0 * itkImage->GetSpacing()[0] * itkImage->GetSpacing()[1] * itkImage->GetSpacing()[2];
00038 }
00039 else if (itkImage->GetLargestPossibleRegion().GetImageDimension() == 2)
00040 {
00041 m_Volume = count / 100.0 * itkImage->GetSpacing()[0] * itkImage->GetSpacing()[1];
00042 }
00043 m_VoxelCount = count;
00044 }
00045
00046 mitk::VolumeCalculator::VolumeCalculator()
00047 : m_Image(NULL),
00048 m_Threshold(0),
00049 m_Volume(0)
00050 {
00051 m_TimeSelector = ImageTimeSelector::New();
00052 }
00053
00054 mitk::VolumeCalculator::~VolumeCalculator()
00055 {
00056 }
00057
00058 std::vector<float> mitk::VolumeCalculator::GetVolumes()
00059 {
00060 return m_Volumes;
00061 }
00062
00063 void mitk::VolumeCalculator::ComputeVolume()
00064 {
00065 const_cast<Image*>(m_Image.GetPointer())->SetRequestedRegionToLargestPossibleRegion();
00066 if (m_Image->GetDimension() == 4)
00067 {
00068 m_TimeSelector->SetInput(m_Image);
00069 m_Volumes.resize(m_Image->GetDimension(3));
00070 for (unsigned int timeStep = 0; timeStep<m_Image->GetDimension(3); ++timeStep)
00071 {
00072 m_TimeSelector->SetTimeNr(timeStep);
00073 m_TimeSelector->Update();
00074 AccessFixedDimensionByItk(m_TimeSelector->GetOutput(),InternalCompute,3);
00075 m_Volumes[timeStep] = m_Volume;
00076 }
00077 }
00078 else if (m_Image->GetDimension() == 3)
00079 {
00080 const_cast<Image*>(m_Image.GetPointer())->Update();
00081 AccessFixedDimensionByItk(m_Image,InternalCompute,3);
00082 }
00083 else if (m_Image->GetDimension() == 2)
00084 {
00085 const_cast<Image*>(m_Image.GetPointer())->Update();
00086 AccessFixedDimensionByItk(m_Image,InternalCompute,2);
00087 }
00088 }
00089
00090 void mitk::VolumeCalculator::ComputeVolumeFromImageStatistics()
00091 {
00092 unsigned int dim = m_Image->GetDimension();
00093
00094 if(dim == 4)
00095 {
00096 m_Volumes.resize(m_Image->GetDimension(3),0);
00097 Vector3D spacing = m_Image->GetSlicedGeometry()->GetSpacing();
00098
00099 for(unsigned int t = 0; t < m_Image->GetDimension(3); ++t )
00100 {
00101 m_Volumes[t] = m_Image->GetCountOfMaxValuedVoxels(t) / 1000.0 * spacing[0] * spacing[1] * spacing[2];
00102 }
00103 }
00104 else if(dim == 3)
00105 {
00106 Vector3D spacing = m_Image->GetSlicedGeometry()->GetSpacing();
00107 m_Volume = m_Image->GetCountOfMaxValuedVoxels() / 1000.0 * spacing[0] * spacing[1] * spacing[2];
00108 }
00109 else if (dim == 2)
00110 {
00111 Vector3D spacing = m_Image->GetGeometry()->GetSpacing();
00112 m_Volume = m_Image->GetCountOfMaxValuedVoxels() / 100.0 * spacing[0] * spacing[1];
00113 }
00114 else itkExceptionMacro(<<"Wrong image dimension...");
00115 }
00116
00117 float mitk::VolumeCalculator::ComputeVolume(Vector3D spacing, unsigned int voxelCount)
00118 {
00119 return (voxelCount / 1000.0 * spacing[0] * spacing[1] * spacing[2]);
00120 }
00121