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
00019 #include "mitkLabeledImageVolumeCalculator.h"
00020 #include "mitkImageAccessByItk.h"
00021
00022 #include <itkImageRegionConstIteratorWithIndex.h>
00023
00024 namespace mitk
00025 {
00026
00027 LabeledImageVolumeCalculator::LabeledImageVolumeCalculator()
00028 {
00029 m_InputTimeSelector = ImageTimeSelector::New();
00030
00031 m_DummyPoint.Fill( 0.0 );
00032 }
00033
00034
00035 LabeledImageVolumeCalculator::~LabeledImageVolumeCalculator()
00036 {
00037 }
00038
00039
00040 double LabeledImageVolumeCalculator::GetVolume( unsigned int label ) const
00041 {
00042 if ( label < m_VolumeVector.size() )
00043 return m_VolumeVector[label];
00044 else
00045 return 0.0;
00046 }
00047
00048 const Point3D &LabeledImageVolumeCalculator::GetCentroid( unsigned int label ) const
00049 {
00050 if ( label < m_CentroidVector.size() )
00051 return m_CentroidVector[label];
00052 else
00053 return m_DummyPoint;
00054 }
00055
00056
00057 const LabeledImageVolumeCalculator::VolumeVector &
00058 LabeledImageVolumeCalculator::GetVolumes() const
00059 {
00060 return m_VolumeVector;
00061 }
00062
00063
00064 const LabeledImageVolumeCalculator::PointVector &
00065 LabeledImageVolumeCalculator::GetCentroids() const
00066 {
00067 return m_CentroidVector;
00068 }
00069
00070
00071 void LabeledImageVolumeCalculator::Calculate()
00072 {
00073 if ( m_Image.IsNull() )
00074 {
00075 itkExceptionMacro( << "Image not set!" );
00076 return;
00077 }
00078
00079 m_InputTimeSelector->SetInput( m_Image );
00080
00081
00082
00083
00084 m_InputTimeSelector->SetTimeNr( 0 );
00085 m_InputTimeSelector->UpdateLargestPossibleRegion();
00086
00087 AccessByItk_2(
00088 m_InputTimeSelector->GetOutput(),
00089 _InternalCalculateVolumes,
00090 this,
00091 m_Image->GetGeometry( 0 ) );
00092
00093 }
00094
00095
00096 template < typename TPixel, unsigned int VImageDimension >
00097 void LabeledImageVolumeCalculator::_InternalCalculateVolumes(
00098 itk::Image< TPixel, VImageDimension > *image,
00099 LabeledImageVolumeCalculator* ,
00100 Geometry3D *geometry )
00101 {
00102 typedef itk::Image< TPixel, VImageDimension > ImageType;
00103 typedef typename ImageType::IndexType IndexType;
00104 typedef itk::ImageRegionConstIteratorWithIndex< ImageType > IteratorType;
00105
00106
00107 m_VolumeVector.clear();
00108 m_CentroidVector.clear();
00109
00110
00111
00112 IteratorType it( image, image->GetBufferedRegion() );
00113 for ( it.GoToBegin(); !it.IsAtEnd(); ++it )
00114 {
00115 const IndexType &index = it.GetIndex();
00116 unsigned int pixel = static_cast<unsigned int>( it.Get() );
00117
00118 if ( m_VolumeVector.size() <= pixel )
00119 {
00120 m_VolumeVector.resize( pixel + 1 );
00121 m_CentroidVector.resize( pixel + 1 );
00122 }
00123
00124 m_VolumeVector[pixel] += 1.0;
00125
00126 m_CentroidVector[pixel][0] += index[0];
00127 m_CentroidVector[pixel][1] += index[1];
00128 m_CentroidVector[pixel][2] += index[2];
00129 }
00130
00131
00132 const Vector3D &spacing = geometry->GetSpacing();
00133 double voxelVolume = spacing[0] * spacing[1] * spacing[2];
00134
00135
00136 for ( unsigned int i = 0; i < m_VolumeVector.size(); ++i )
00137 {
00138 if ( m_VolumeVector[i] > 0.0 )
00139 {
00140 m_CentroidVector[i][0] /= m_VolumeVector[i];
00141 m_CentroidVector[i][1] /= m_VolumeVector[i];
00142 m_CentroidVector[i][2] /= m_VolumeVector[i];
00143 geometry->IndexToWorld( m_CentroidVector[i], m_CentroidVector[i] );
00144
00145 m_VolumeVector[i] *= voxelVolume;
00146 }
00147 }
00148 }
00149
00150 }