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 }