two_byte_volume_pixel_dataset.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------
00012 //---------------------------------------------------
00013 
00014 #include "two_byte_volume_pixel_dataset.h"
00015 #include "two_byte_image_pixel_dataset.h"
00016 
00017 #include <limits>
00018 
00019 namespace imedgine 
00020 {
00021   //---------------------------------------------------
00022   
00023   TwoByteVolumePixelDataset::TwoByteVolumePixelDataset(dataset_key_type dataset_key,
00024       volume_pointer_type volume)
00025   : VolumePixelDataset(TWO_BYTE_VOLUME_PIXEL_DATASET, dataset_key, 2),
00026     resampling_filter_(resampling_filter_type::New()),
00027     slice_extractor_(slice_extractor_type::New()),
00028     image_extractor_(image_extractor_type::New()),
00029     volume_intensity_filter_(volume_intensity_filter_type::New()),
00030     image_intensity_filter_(image_intensity_filter_type::New())
00031   {
00032     resampling_filter_->SetTransform(transform_);
00033     resampling_filter_->SetDefaultPixelValue(std::numeric_limits<pixel_type>::min());
00034     
00035     if (volume.IsNull() == false)
00036     {
00037       this->setDatasetInternal(volume);
00038     } 
00039   }
00040   
00041   //---------------------------------------------------
00042   
00043   TwoByteVolumePixelDataset::TwoByteVolumePixelDataset(TwoByteVolumePixelDataset const& src) 
00044   : VolumePixelDataset(src),
00045     resampling_filter_(resampling_filter_type::New()),
00046     slice_extractor_(slice_extractor_type::New()),
00047     image_extractor_(image_extractor_type::New()),
00048     volume_intensity_filter_(volume_intensity_filter_type::New()),
00049     image_intensity_filter_(image_intensity_filter_type::New())
00050   {
00051     resampling_filter_->SetTransform(transform_);
00052     resampling_filter_->SetDefaultPixelValue(std::numeric_limits<pixel_type>::min());
00053   }
00054   
00055   //---------------------------------------------------
00056   
00057   TwoByteVolumePixelDataset::~TwoByteVolumePixelDataset()
00058   {
00059   }
00060   
00061   //---------------------------------------------------
00062   
00063   external_data_pointer_type TwoByteVolumePixelDataset::getData() const
00064       throw(NullPointerException)
00065   {
00066     if (dataset_.IsNull())
00067     {
00068       throw(NullPointerException("TwoByteVolumePixelDataset::getData()"));
00069     }
00070     
00071     volume_intensity_filter_->UpdateLargestPossibleRegion();
00072     
00073     external_volume_pointer_type volume = volume_intensity_filter_->GetOutput();
00074     volume->DisconnectPipeline();
00075     volume->GetPixelContainer()->ContainerManageMemoryOff();
00076     
00077     return(volume->GetBufferPointer());
00078   }
00079   
00080   //--------------------------------------------------
00081   
00082   void TwoByteVolumePixelDataset::setDataset(volume_pointer_type dataset)
00083   {
00084     setDatasetInternal(dataset);
00085     is_dirty_ = true;
00086   }
00087   
00088   //--------------------------------------------------
00089   
00090   void TwoByteVolumePixelDataset::setDatasetInternal(volume_pointer_type dataset)
00091   {  
00092     dataset_ = dataset;
00093     is_data_set_ = true;
00094 
00095     min_pixel_value_ = std::numeric_limits<pixel_type>::max();
00096     max_pixel_value_ = 0;
00097     
00098     const_volume_iterator_type vol_iter(
00099         dataset_, dataset_->GetLargestPossibleRegion());
00100     for (vol_iter.GoToBegin(); !vol_iter.IsAtEnd(); ++vol_iter)
00101     {
00102       if (vol_iter.Value() > max_pixel_value_)
00103       {
00104         max_pixel_value_ = vol_iter.Value();
00105       }  
00106       if (vol_iter.Value() < min_pixel_value_)
00107       {
00108         min_pixel_value_ = vol_iter.Value();
00109       }
00110     }
00111     
00112     region_type volume_region = dataset_->GetLargestPossibleRegion();
00113     region_size_type volume_size = volume_region.GetSize();
00114     dataset_size_[X_DIMENSION] = volume_size[X_DIMENSION];
00115     dataset_size_[Y_DIMENSION] = volume_size[Y_DIMENSION];
00116     dataset_size_[Z_DIMENSION] = volume_size[Z_DIMENSION];
00117 
00118     region_size_type region_size = volume_size;
00119     region_size[Z_DIMENSION] = 0;
00120     xy_region_to_extract_.SetSize(region_size);
00121     
00122     region_size = volume_size;
00123     region_size[Y_DIMENSION] = 0;
00124     xz_region_to_extract_.SetSize(region_size);
00125     
00126     region_size = volume_size;
00127     region_size[X_DIMENSION] = 0;
00128     yz_region_to_extract_.SetSize(region_size);
00129     
00130     xy_region_to_extract_.SetIndex(volume_region.GetIndex());
00131     xz_region_to_extract_.SetIndex(volume_region.GetIndex());
00132     yz_region_to_extract_.SetIndex(volume_region.GetIndex()); 
00133      
00134     transform_->SetIdentity(); 
00135     resampling_filter_->SetOutputSpacing(dataset_->GetSpacing());
00136     resampling_filter_->SetOutputOrigin(dataset_->GetOrigin());
00137     resampling_filter_->SetSize(dataset_->GetLargestPossibleRegion().GetSize());
00138 
00139     
00140     image_extractor_->SetInput(dataset_);
00141     
00142     resampling_filter_->SetInput(dataset_);    
00143     slice_extractor_->SetInput(resampling_filter_->GetOutput());
00144     image_intensity_filter_->SetInput(slice_extractor_->GetOutput());
00145     
00146     image_intensity_filter_->SetWindowMinimum(static_cast<pixel_type>(min_pixel_value_));
00147     image_intensity_filter_->SetWindowMaximum(static_cast<pixel_type>(max_pixel_value_));
00148     image_intensity_filter_->SetOutputMinimum(0);
00149     image_intensity_filter_->SetOutputMaximum(
00150         std::numeric_limits<external_pixel_type>::max());
00151     
00152     volume_intensity_filter_->SetInput(dataset_);
00153     volume_intensity_filter_->SetWindowMinimum(static_cast<pixel_type>(min_pixel_value_));
00154     volume_intensity_filter_->SetWindowMaximum(static_cast<pixel_type>(max_pixel_value_));
00155     volume_intensity_filter_->SetOutputMinimum(0);
00156     volume_intensity_filter_->SetOutputMaximum(
00157         std::numeric_limits<external_pixel_type>::max());
00158         
00159     xy_slice_rois_.resize(dataset_size_[Z_DIMENSION]);
00160     xz_slice_rois_.resize(dataset_size_[Y_DIMENSION]);
00161     yz_slice_rois_.resize(dataset_size_[X_DIMENSION]);
00162   }
00163   
00164   //--------------------------------------------------
00165   
00166   TwoByteVolumePixelDataset::const_volume_pointer_type 
00167       TwoByteVolumePixelDataset::getDataset() const
00168   {
00169     return(dataset_);
00170   }
00171   
00172   //--------------------------------------------------
00173  
00174   TwoByteVolumePixelDataset::volume_pointer_type
00175       TwoByteVolumePixelDataset::getDataset()
00176   {
00177     return(dataset_);
00178   }
00179   
00180   
00181   //--------------------------------------------------
00182  
00183   void TwoByteVolumePixelDataset::setIntensity(double window, double level)
00184   {
00185     if (level > max_pixel_value_)
00186     {
00187       level = max_pixel_value_;
00188     }
00189     else if (level < min_pixel_value_)
00190     {
00191       level = min_pixel_value_;
00192     }
00193     
00194     double new_window_min = level - static_cast<int>(window / 2.0);
00195     double new_window_max = level + static_cast<int>(window / 2.0);
00196     
00197 
00198     if (new_window_min < std::numeric_limits<pixel_type>::min())
00199     {
00200       new_window_min = std::numeric_limits<pixel_type>::min();
00201     }
00202     else if (new_window_max > std::numeric_limits<pixel_type>::max())
00203     {
00204       new_window_max = std::numeric_limits<pixel_type>::max();
00205     }
00206     
00207     image_intensity_filter_->SetWindowMinimum(
00208         static_cast<pixel_type>(new_window_min));
00209     
00210     image_intensity_filter_->SetWindowMaximum(
00211         static_cast<pixel_type>(new_window_max));
00212     
00213     volume_intensity_filter_->SetWindowMinimum(
00214         static_cast<pixel_type>(new_window_min));
00215     
00216     volume_intensity_filter_->SetWindowMaximum(
00217         static_cast<pixel_type>(new_window_max));
00218   }
00219   
00220   //--------------------------------------------------
00221   
00222   double TwoByteVolumePixelDataset::getIntensityWindow() const
00223   throw(NullPointerException)
00224   {
00225     if (image_intensity_filter_.IsNull())
00226     {
00227       throw(NullPointerException("TwoByteVolumePixelDataset::getIntensityWindow()"));
00228     }
00229     return(static_cast<double>(image_intensity_filter_->GetWindow()));
00230   }
00231 
00232   //--------------------------------------------------
00233 
00234   double TwoByteVolumePixelDataset::getIntensityLevel() const
00235   throw(NullPointerException)
00236   {
00237     if (image_intensity_filter_.IsNull())
00238     {
00239       throw(NullPointerException("TwoByteVolumePixelDataset::getIntensityLevel()"));
00240     }
00241     return(static_cast<double>(image_intensity_filter_->GetLevel()));
00242   }
00243   
00244   //--------------------------------------------------
00245     
00246   external_data_pointer_type TwoByteVolumePixelDataset::getSliceXY(
00247     index_type z_index)
00248       throw(NullPointerException, IndexOutOfBoundsException)
00249   {
00250     if (dataset_.IsNull() || slice_extractor_.IsNull())
00251     {
00252       throw(NullPointerException("TwoByteVolumePixelDataset::getSliceXY"));
00253     }
00254     if (z_index >= dataset_size_[Z_DIMENSION])
00255     {
00256       throw(IndexOutOfBoundsException("TwoByteVolumePixelDataset::getSliceXY"));
00257     }
00258     
00259     xy_region_to_extract_.SetIndex(Z_DIMENSION, z_index);
00260     slice_extractor_->SetExtractionRegion(xy_region_to_extract_);
00261     
00262     image_intensity_filter_->UpdateLargestPossibleRegion();
00263     
00264     external_image_type::Pointer slice = image_intensity_filter_->GetOutput();
00265     slice->DisconnectPipeline();
00266     slice->GetPixelContainer()->ContainerManageMemoryOff();
00267     
00268     return(slice->GetBufferPointer());
00269   }
00270   
00271   //--------------------------------------------------
00272     
00273   external_data_pointer_type TwoByteVolumePixelDataset::getSliceXZ(
00274     index_type y_index)
00275       throw(NullPointerException, IndexOutOfBoundsException)
00276   {
00277     if (dataset_.IsNull() || slice_extractor_.IsNull())
00278     {
00279       throw(NullPointerException("TwoByteVolumePixelDataset::getSliceXZ"));
00280     }
00281     if (y_index >= dataset_size_[Y_DIMENSION])
00282     {
00283       throw(IndexOutOfBoundsException("TwoByteVolumePixelDataset::getSliceXZ"));
00284     }
00285    
00286     xz_region_to_extract_.SetIndex(Y_DIMENSION, y_index);
00287     slice_extractor_->SetExtractionRegion(xz_region_to_extract_);
00288     image_intensity_filter_->UpdateLargestPossibleRegion();
00289     
00290     external_image_type::Pointer slice = image_intensity_filter_->GetOutput();
00291     slice->DisconnectPipeline();
00292     slice->GetPixelContainer()->ContainerManageMemoryOff();
00293     
00294     return(slice->GetBufferPointer());
00295   }
00296   
00297   //--------------------------------------------------
00298     
00299   external_data_pointer_type TwoByteVolumePixelDataset::getSliceYZ(
00300     index_type x_index)
00301       throw(NullPointerException, IndexOutOfBoundsException)
00302   {
00303     if (dataset_.IsNull() || slice_extractor_.IsNull())
00304     {
00305       throw(NullPointerException("TwoByteVolumePixelDataset::getSliceYZ"));
00306     }
00307     if (x_index >= dataset_size_[X_DIMENSION])
00308     {
00309       throw(IndexOutOfBoundsException("TwoByteVolumePixelDataset::getSliceYZ"));
00310     }
00311     
00312     yz_region_to_extract_.SetIndex(X_DIMENSION, x_index); 
00313     slice_extractor_->SetExtractionRegion(yz_region_to_extract_);
00314     image_intensity_filter_->UpdateLargestPossibleRegion();
00315     
00316     external_image_type::Pointer slice = image_intensity_filter_->GetOutput();
00317     slice->DisconnectPipeline();
00318     slice->GetPixelContainer()->ContainerManageMemoryOff();
00319 
00320     return(slice->GetBufferPointer());
00321   }
00322   
00323     //--------------------------------------------------
00324     
00325   dataset_pointer_type TwoByteVolumePixelDataset::getImageXY(
00326     index_type z_index, dataset_key_type image_key)
00327       throw(NullPointerException, IndexOutOfBoundsException)
00328   {
00329     if (dataset_.IsNull() || image_extractor_.IsNull())
00330     {
00331       throw(NullPointerException("OneByteVolumePixelDataset::getSliceXY"));
00332     }
00333     if (z_index >= dataset_size_[Z_DIMENSION])
00334     {
00335       throw(IndexOutOfBoundsException("OneByteVolumePixelDataset::getSliceXY"));
00336     }
00337 
00338     xy_region_to_extract_.SetIndex(Z_DIMENSION, z_index);
00339     image_extractor_->SetExtractionRegion(xy_region_to_extract_);
00340     
00341     image_extractor_->UpdateLargestPossibleRegion();
00342     
00343     image_type::Pointer image = image_extractor_->GetOutput();
00344     image->DisconnectPipeline();
00345     image->GetPixelContainer()->ContainerManageMemoryOff();
00346 
00347     TwoByteImagePixelDataset* image_dataset(new TwoByteImagePixelDataset(image_key, image));
00348 
00349     image_dataset->setRegionsOfInterest(this->getRegionsOfInterestForSliceXY(z_index));
00350     image_dataset->setIntensity(this->getIntensityWindow(), this->getIntensityLevel());
00351 
00352     return(dataset_pointer_type(image_dataset));
00353   }
00354     
00355  //--------------------------------------------------
00356       
00357   dataset_pointer_type TwoByteVolumePixelDataset::getImageXZ(
00358     index_type y_index, dataset_key_type image_key)
00359     throw(NullPointerException, IndexOutOfBoundsException)
00360   {
00361     if (dataset_.IsNull() || image_extractor_.IsNull())
00362     {
00363       throw(NullPointerException("OneByteVolumePixelDataset::getSliceXZ"));
00364     }
00365     if (y_index >= dataset_size_[Y_DIMENSION])
00366     {
00367       throw(IndexOutOfBoundsException("OneByteVolumePixelDataset::getSliceXZ"));
00368     }
00369 
00370     xz_region_to_extract_.SetIndex(Y_DIMENSION, y_index);
00371     image_extractor_->SetExtractionRegion(xz_region_to_extract_);
00372     
00373     image_extractor_->UpdateLargestPossibleRegion();
00374     
00375     image_type::Pointer image = image_extractor_->GetOutput();
00376     image->DisconnectPipeline();
00377     image->GetPixelContainer()->ContainerManageMemoryOff();
00378 
00379     TwoByteImagePixelDataset* image_dataset(new TwoByteImagePixelDataset(image_key, image));
00380 
00381     image_dataset->setRegionsOfInterest(this->getRegionsOfInterestForSliceXZ(y_index));
00382     image_dataset->setIntensity(this->getIntensityWindow(), this->getIntensityLevel());
00383 
00384     return(dataset_pointer_type(image_dataset));
00385   }
00386     
00387   //-------------------------------------------------
00388       
00389   dataset_pointer_type TwoByteVolumePixelDataset::getImageYZ(
00390       index_type x_index, dataset_key_type image_key)
00391       throw(NullPointerException, IndexOutOfBoundsException)
00392   {
00393     if (dataset_.IsNull() || image_extractor_.IsNull())
00394     {
00395       throw(NullPointerException("OneByteVolumePixelDataset::getSliceYZ"));
00396     }
00397     if (x_index >= dataset_size_[X_DIMENSION])
00398     {
00399       throw(IndexOutOfBoundsException("OneByteVolumePixelDataset::getSliceYZ"));
00400     }
00401 
00402     yz_region_to_extract_.SetIndex(X_DIMENSION, x_index); 
00403     image_extractor_->SetExtractionRegion(yz_region_to_extract_);
00404     
00405     image_extractor_->UpdateLargestPossibleRegion();
00406     
00407     image_type::Pointer image = image_extractor_->GetOutput();
00408     image->DisconnectPipeline();
00409     image->GetPixelContainer()->ContainerManageMemoryOff();
00410 
00411     TwoByteImagePixelDataset* image_dataset(new TwoByteImagePixelDataset(image_key, image));
00412 
00413     image_dataset->setRegionsOfInterest(this->getRegionsOfInterestForSliceYZ(x_index));
00414     image_dataset->setIntensity(this->getIntensityWindow(), this->getIntensityLevel());
00415 
00416     return(dataset_pointer_type(image_dataset));
00417   }
00418     
00419 } // namespace imedgine

Generated on Sun Aug 13 18:19:39 2006 for iMEDgine by  doxygen 1.4.6