8 namespace ModelFitting {
10 template<
typename ImageType>
18 :
CompactModelBase<ImageType>(x_scale, y_scale, rotation, width, height, x, y, transform),
19 m_sharp_radius_squared(float(sharp_radius * sharp_radius)),
23 template<
typename ImageType>
26 model_eval.
transform = getCombinedTransform(1.0);
27 model_eval.
i0 = m_i0->getValue();
28 model_eval.
k = m_k->getValue();
31 auto area_correction = (1.0 /
fabs(m_jacobian[0] * m_jacobian[3] - m_jacobian[1] * m_jacobian[2]));
35 template<
typename ImageType>
40 if (size_x % 2 == 0 || size_y % 2 == 0) {
42 <<
"but got (" << size_x <<
',' << size_y <<
")";
45 ImageType image = Traits::factory(size_x, size_y);
47 auto combined_tranform = getCombinedTransform(pixel_scale);
50 model_eval.
transform = getCombinedTransform(pixel_scale);
51 model_eval.
i0 = m_i0->getValue();
52 model_eval.
k = m_k->getValue();
53 model_eval.
max_r_sqr = getMaxRadiusSqr(size_x, size_y, combined_tranform);
55 float area_correction = (1.0 /
fabs(m_jacobian[0] * m_jacobian[3] - m_jacobian[1] * m_jacobian[2])) * pixel_scale * pixel_scale;
57 for (
int x=0;
x<(int)size_x; ++
x) {
58 int dx =
x - size_x / 2;
59 for (
int y=0;
y<(int)size_y; ++
y) {
60 int dy =
y - size_y / 2;
61 if (dx*dx + dy*dy < m_sharp_radius_squared) {
62 Traits::at(image,
x,
y) = adaptiveSamplePixel(model_eval, dx, dy, 8, 1.01) * area_correction;
64 Traits::at(image,
x,
y) = model_eval.
evaluateModel(dx, dy) * area_correction;
ImageType getRasterizedImage(double pixel_scale, std::size_t size_x, std::size_t size_y) const override
float evaluateModel(float x, float y) const
CompactExponentialModel(double sharp_radius, std::shared_ptr< BasicParameter > i0, std::shared_ptr< BasicParameter > k, std::shared_ptr< BasicParameter > x_scale, std::shared_ptr< BasicParameter > y_scale, std::shared_ptr< BasicParameter > rotation, double width, double height, std::shared_ptr< BasicParameter > x, std::shared_ptr< BasicParameter > y, std::tuple< double, double, double, double > transform)
std::shared_ptr< EngineParameter > dx
double getValue(double x, double y) const override
std::shared_ptr< EngineParameter > dy