SourceXtractorPlusPlus  0.13
Please provide a description of the project.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ScaledImageSource.h
Go to the documentation of this file.
1 
18 #ifndef _SEFRAMEWORK_IMAGE_SCALEDIMAGESOURCE_H
19 #define _SEFRAMEWORK_IMAGE_SCALEDIMAGESOURCE_H
20 
23 
24 namespace SourceXtractor {
25 
33 template<typename T>
35 public:
37  enum class InterpolationType {
39  };
40 
53  : m_image(image), m_width(width), m_height(height) {
54  m_wscale = std::ceil(static_cast<float>(width) / image->getWidth());
55  m_hscale = std::ceil(static_cast<float>(height) / image->getHeight());
56 
57  switch (interp_type) {
60  break;
63  break;
64  }
65 
66  // Generate y coordinates on the original image
67  std::vector<double> y_coords(image->getHeight());
68  for (size_t i = 0; i < y_coords.size(); ++i) {
69  y_coords[i] = std::floor((i + 0.5) * m_hscale);
70  }
71 
72  // Generate x coordinates on the original image
73  m_x_coords.resize(image->getWidth());
74  for (size_t i = 0; i < m_x_coords.size(); ++i) {
75  m_x_coords[i] = std::floor((i + 0.5) * m_wscale);
76  }
77 
78  // Store interpolation along columns
79  m_interpolated_cols.reserve(image->getWidth());
80  for (int x = 0; x < image->getWidth(); ++x) {
81  std::vector<double> values(image->getHeight());
82  for (int y = 0; y < image->getHeight(); ++y) {
83  values[y] = image->getValue(x, y);
84  }
86  Euclid::MathUtils::interpolate(y_coords, values, m_interpolation_type, true));
87  }
88  }
89 
93  virtual ~ScaledImageSource() = default;
94 
98  std::string getRepr() const final {
99  return std::string("ScaledImageSource");
100  }
101 
115  std::shared_ptr<ImageTile> getImageTile(int x, int y, int width, int height) const final {
117 
118  for (int off_y = 0; off_y < height; ++off_y) {
120  for (size_t ix = 0; ix < m_x_coords.size(); ++ix) {
121  auto& fy = *m_interpolated_cols[ix];
122  v[ix] = fy(y + off_y);
123  }
125  for (int off_x = 0; off_x < width; ++off_x) {
126  tile->setValue(x + off_x, y + off_y, T((*fx)(x + off_x)));
127  }
128  }
129  return tile;
130  }
131 
135  void saveTile(ImageTile&) final {
136  assert(false);
137  }
138 
142  int getWidth() const final {
143  return m_width;
144  }
145 
149  int getHeight() const final {
150  return m_height;
151  }
152 
153  ImageTile::ImageType getType() const override {
154  return ImageTile::getTypeValue(T());
155  }
156 
157 private:
164 };
165 
166 } // end of namespace SourceXtractor
167 
168 #endif // _SEFRAMEWORK_IMAGE_SCALEDIMAGESOURCE_H
std::shared_ptr< Image< T > > m_image
virtual ~ScaledImageSource()=default
std::shared_ptr< ImageTile > getImageTile(int x, int y, int width, int height) const final
T ceil(T...args)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
InterpolationType
Interpolation type: bilinear or bicubic.
T floor(T...args)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
std::string getRepr() const final
T resize(T...args)
STL class.
Euclid::MathUtils::InterpolationType m_interpolation_type
T size(T...args)
static std::shared_ptr< ImageTile > create(ImageType image_type, int x, int y, int width, int height, std::shared_ptr< ImageSource > source=nullptr)
Definition: ImageTile.cpp:96
Interface representing an image.
Definition: Image.h:43
ScaledImageSource(const std::shared_ptr< Image< T >> &image, int width, int height, InterpolationType interp_type=InterpolationType::BICUBIC)
ELEMENTS_API std::unique_ptr< Function > interpolate(const std::vector< double > &x, const std::vector< double > &y, InterpolationType type, bool extrapolate=false)
void saveTile(ImageTile &) final
static ImageType getTypeValue(float)
Definition: ImageTile.h:109
std::vector< std::unique_ptr< Euclid::MathUtils::Function > > m_interpolated_cols
ImageTile::ImageType getType() const override
T reserve(T...args)
T emplace_back(T...args)