SourceXtractorPlusPlus  0.8
Please provide a description of the project.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ExtendedModel.icpp
Go to the documentation of this file.
1 
23 #include <iostream>
24 #include <cmath> // for std::sqrt
27 
28 namespace ModelFitting {
29 
30 namespace _impl {
31 
32  template <typename ImageType>
33  void addSharp(ImageType& image, double pixel_scale, ModelComponent& component) {
34  using Traits = ImageTraits<ImageType>;
35  auto size_x = Traits::width(image);
36  auto size_y = Traits::height(image);
37  for (auto& sample : component.getSharpSampling()) {
38  std::size_t image_x = std::get<0>(sample) / pixel_scale + size_x/2.;
39  std::size_t image_y = std::get<1>(sample) / pixel_scale + size_y/2.;
40  if (image_x>=0 && image_x<size_x && image_y>=0 && image_y<size_y) {
41  Traits::at(image, image_x, image_y) += std::get<2>(sample);
42  }
43  }
44  }
45 
46  template <typename ImageType>
47  void addSmooth(ImageType& image, double pixel_scale, ModelComponent& component) {
48  using Traits = ImageTraits<ImageType>;
49  auto size_x = Traits::width(image);
50  auto size_y = Traits::height(image);
51  for (std::size_t x=0; x<size_x; ++x) {
52  double x_model = x - (size_x-1) / 2.;
53  x_model *= pixel_scale;
54  for (std::size_t y=0; y<size_y; ++y) {
55  double y_model = y - (size_y-1) / 2.;
56  y_model *= pixel_scale;
57  if (!component.insideSharpRegion(x_model-pixel_scale/2., y_model-pixel_scale/2.) ||
58  !component.insideSharpRegion(x_model-pixel_scale/2., y_model+pixel_scale/2.) ||
59  !component.insideSharpRegion(x_model+pixel_scale/2., y_model-pixel_scale/2.) ||
60  !component.insideSharpRegion(x_model+pixel_scale/2., y_model+pixel_scale/2.)) {
61  Traits::at(image, x, y) = component.getValue(x_model, y_model) * pixel_scale*pixel_scale;
62  }
63  }
64  }
65  }
66 
67 } // end of namespace _impl
68 
69 template<typename ImageType>
70 ImageType ExtendedModel::getRasterizedImage(double pixel_scale, std::size_t size_x, std::size_t size_y) const {
71  //std::cout << "]] " << getX() << " " << getY() << "\n";
72  using Traits = ImageTraits<ImageType>;
73  if (size_x % 2 == 0 || size_y % 2 == 0) {
74  throw Elements::Exception() << "Rasterized image dimensions must be odd numbers "
75  << "but got (" << size_x << ',' << size_y << ")";
76  }
77  ImageType image = Traits::factory(size_x, size_y);
78  double r_max = std::sqrt(size_x * size_x + size_y * size_y) / 2.;
79  for (auto& component : m_component_list) {
80  component->updateRasterizationInfo(pixel_scale, r_max);
81  ImageType comp_image = Traits::factory(size_x, size_y);
82  _impl::addSharp(comp_image, pixel_scale, *component);
83  _impl::addSmooth(comp_image, pixel_scale, *component);
84  for (auto im_it = Traits::begin(image), comp_it = Traits::begin(comp_image);
85  im_it != Traits::end(image); ++im_it, ++comp_it) {
86  *im_it += *comp_it;
87  }
88  }
89  return image;
90 }
91 
92 } // end of namespace ModelFitting
void addSharp(ImageType &image, double pixel_scale, ModelComponent &component)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
virtual bool insideSharpRegion(double x, double y)=0
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
virtual std::vector< ModelSample > getSharpSampling()=0
virtual double getValue(double x, double y)=0
std::vector< std::unique_ptr< ModelComponent > > m_component_list
Definition: ExtendedModel.h:57
ImageType getRasterizedImage(double pixel_scale, std::size_t size_x, std::size_t size_y) const
T sqrt(T...args)
void addSmooth(ImageType &image, double pixel_scale, ModelComponent &component)
const double pixel_scale
Definition: TestImage.cpp:72