00001 #ifndef IMAGE_SCALINGACCESSOR_H 00002 #define IMAGE_SCALINGACCESSOR_H 00003 00004 #include <image/ImageAccessorInterface.hpp> 00005 00006 namespace imaging 00007 { 00025 template <class float_accessor_t> 00026 class ScalingAccessor : public ImageAccessorInterface<float_accessor_t, float_t> 00027 { 00028 public: 00029 static const size_t dimension = ImageAccessorInterface<float_accessor_t, float_t>::dimension; 00030 typedef float_t data_t; 00031 00032 private: 00034 class data_reference 00035 { 00036 ScalingAccessor<float_accessor_t> & _accessor_reference; 00037 const ublas::fixed_vector<size_t, dimension> & _index_reference; 00038 00039 public: 00040 data_reference(ScalingAccessor<float_accessor_t> & accessor, const ublas::fixed_vector<size_t, dimension> & index) : _accessor_reference(accessor), _index_reference(index) {} 00041 00042 float_t operator=(const float_t & input) 00043 { _accessor_reference._image_reference[_index_reference] = input / _accessor_reference._factor - _accessor_reference._level; return input; } 00044 00045 operator float_t() const { return _accessor_reference._factor * (_accessor_reference._image_reference[_index_reference] + _accessor_reference._level); } 00046 }; 00049 float_t _factor; 00050 float_t _level; 00051 00052 public: 00055 ScalingAccessor(float_accessor_t & image, float_t factor = 1.0, float_t level = 0.0) : 00056 ImageAccessorInterface<float_accessor_t, float_t>(image), _factor(factor), _level(level) {} 00057 00058 float_t operator[](const ublas::fixed_vector<size_t, dimension> & index) const { return _factor * (ImageAccessorInterface<float_accessor_t, float_t>::_image_reference[index] + _level); } 00059 data_reference operator[](const ublas::fixed_vector<size_t, dimension> & index) { return data_reference(*this, index); } 00060 }; 00061 00062 } 00063 00064 #endif