00001 //-------------------------------------------------- 00012 //--------------------------------------------------- 00013 00014 #include "two_byte_image_pixel_dataset.h" 00015 00016 #include <limits> 00017 00018 namespace imedgine 00019 { 00020 //--------------------------------------------------- 00021 00022 TwoByteImagePixelDataset::TwoByteImagePixelDataset( 00023 dataset_key_type dataset_key, image_pointer_type image) 00024 : ImagePixelDataset(TWO_BYTE_IMAGE_PIXEL_DATASET, dataset_key, 2), 00025 image_intensity_filter_(image_intensity_filter_type::New()) 00026 { 00027 if (image.IsNull() == false) 00028 { 00029 this->setDatasetInternal(image); 00030 } 00031 } 00032 00033 //--------------------------------------------------- 00034 00035 TwoByteImagePixelDataset::TwoByteImagePixelDataset(TwoByteImagePixelDataset const& src) 00036 : ImagePixelDataset(src), 00037 image_intensity_filter_(image_intensity_filter_type::New()) 00038 { 00039 } 00040 00041 //--------------------------------------------------- 00042 00043 TwoByteImagePixelDataset::~TwoByteImagePixelDataset() 00044 { 00045 } 00046 00047 //--------------------------------------------------- 00048 00049 external_data_pointer_type TwoByteImagePixelDataset::getData() const 00050 throw(NullPointerException) 00051 { 00052 if (dataset_.IsNull()) 00053 { 00054 throw(NullPointerException("TwoByteImagePixelDataset::getData()")); 00055 } 00056 00057 image_intensity_filter_->UpdateLargestPossibleRegion(); 00058 00059 external_image_type::Pointer image = image_intensity_filter_->GetOutput(); 00060 image->DisconnectPipeline(); 00061 image->GetPixelContainer()->ContainerManageMemoryOff(); 00062 00063 return(external_data_pointer_type(image->GetBufferPointer())); 00064 } 00065 00066 //-------------------------------------------------- 00067 00068 TwoByteImagePixelDataset::image_pointer_type 00069 TwoByteImagePixelDataset::getDataset() 00070 { 00071 return(dataset_); 00072 } 00073 00074 //-------------------------------------------------- 00075 00076 TwoByteImagePixelDataset::const_image_pointer_type 00077 TwoByteImagePixelDataset::getDataset() const 00078 { 00079 return(dataset_); 00080 } 00081 00082 //-------------------------------------------------- 00083 00084 void TwoByteImagePixelDataset::setDataset(image_pointer_type dataset) 00085 { 00086 setDatasetInternal(dataset); 00087 is_dirty_ = true; 00088 } 00089 00090 //-------------------------------------------------- 00091 00092 void TwoByteImagePixelDataset::setDatasetInternal(image_pointer_type dataset) 00093 { 00094 dataset_ = dataset; 00095 is_data_set_ = true; 00096 00097 const_image_iterator_type image_iter( 00098 dataset_, dataset_->GetLargestPossibleRegion()); 00099 for (image_iter.GoToBegin(); !image_iter.IsAtEnd(); ++image_iter) 00100 { 00101 if (image_iter.Value() > max_pixel_value_) 00102 { 00103 max_pixel_value_ = image_iter.Value(); 00104 } 00105 if (image_iter.Value() < min_pixel_value_) 00106 { 00107 min_pixel_value_ = image_iter.Value(); 00108 } 00109 } 00110 00111 region_type image_region = dataset_->GetLargestPossibleRegion(); 00112 region_size_type image_size = image_region.GetSize(); 00113 dataset_size_[X_DIMENSION] = image_size[X_DIMENSION]; 00114 dataset_size_[Y_DIMENSION] = image_size[Y_DIMENSION]; 00115 00116 image_intensity_filter_->SetInput(dataset_); 00117 00118 image_intensity_filter_->SetWindowMinimum(static_cast<pixel_type>(min_pixel_value_)); 00119 image_intensity_filter_->SetWindowMaximum(static_cast<pixel_type>(max_pixel_value_)); 00120 image_intensity_filter_->SetOutputMinimum(0); 00121 image_intensity_filter_->SetOutputMaximum( 00122 std::numeric_limits<external_pixel_type>::max()); 00123 } 00124 00125 //-------------------------------------------------- 00126 00127 void TwoByteImagePixelDataset::setIntensity(double window, double level) 00128 { 00129 if (level > max_pixel_value_) 00130 { 00131 level = max_pixel_value_; 00132 } 00133 else if (level < min_pixel_value_) 00134 { 00135 level = min_pixel_value_; 00136 } 00137 00138 double new_window_min = level - static_cast<int>(window / 2.0); 00139 double new_window_max = level + static_cast<int>(window / 2.0); 00140 00141 00142 if (new_window_min < std::numeric_limits<pixel_type>::min()) 00143 { 00144 new_window_min = std::numeric_limits<pixel_type>::min(); 00145 } 00146 else if (new_window_max > std::numeric_limits<pixel_type>::max()) 00147 { 00148 new_window_max = std::numeric_limits<pixel_type>::max(); 00149 } 00150 00151 image_intensity_filter_->SetWindowMinimum( 00152 static_cast<pixel_type>(new_window_min)); 00153 00154 image_intensity_filter_->SetWindowMaximum( 00155 static_cast<pixel_type>(new_window_max)); 00156 } 00157 00158 //-------------------------------------------------- 00159 00160 double TwoByteImagePixelDataset::getIntensityWindow() const 00161 throw(NullPointerException) 00162 { 00163 if (image_intensity_filter_.IsNull()) 00164 { 00165 throw(NullPointerException("OneByteVolumePixelDataset::getIntensityWindow()")); 00166 } 00167 return(static_cast<double>(image_intensity_filter_->GetWindow())); 00168 } 00169 00170 //-------------------------------------------------- 00171 00172 double TwoByteImagePixelDataset::getIntensityLevel() const 00173 throw(NullPointerException) 00174 { 00175 if (image_intensity_filter_.IsNull()) 00176 { 00177 throw(NullPointerException("OneByteVolumePixelDataset::getIntensityLevel()")); 00178 } 00179 return(static_cast<double>(image_intensity_filter_->GetLevel())); 00180 } 00181 00182 } // namespace imedgine