23 #ifndef _SEFRAMEWORK_CONVOLUTION_DFT_H
24 #define _SEFRAMEWORK_CONVOLUTION_DFT_H
33 #include <boost/thread/shared_mutex.hpp>
36 namespace SourceXtractor {
45 template<
typename T = SeFloat,
class TPadding = PaddedImage<T, Reflect101Coordinates>>
105 auto context = make_unique<ConvolutionContext>();
108 context->m_padded_width = model_ptr->getWidth() +
m_kernel->getWidth() - 1;
109 context->m_padded_height = model_ptr->getHeight() +
m_kernel->getHeight() - 1;
116 context->m_total_size = context->m_padded_width * context->m_padded_height;
119 context->m_real_buffer.resize(context->m_total_size);
120 context->m_complex_buffer.resize(context->m_total_size);
121 context->m_kernel_transform.resize(context->m_total_size);
125 context->m_real_buffer, context->m_complex_buffer);
127 context->m_complex_buffer, context->m_real_buffer);
130 padKernel(context->m_padded_width, context->m_padded_height, context->m_real_buffer.begin());
150 template <
typename ...Args>
153 Args... padding_args)
const {
158 auto padded = TPadding::create(image_ptr,
160 std::forward<Args>(padding_args)...);
177 auto wpad = (context->
m_padded_width - image_ptr->getWidth()) / 2;
179 for (
int y = 0;
y < image_ptr->getHeight(); ++
y) {
180 for (
int x = 0;
x < image_ptr->getWidth(); ++
x) {
181 image_ptr->setValue(
x,
y,
199 template <
typename ...Args>
201 auto context =
prepare(image_ptr);
217 if (width % 2 == 0) center.
m_x--;
218 if (height % 2 == 0) center.m_y--;
225 for (
int y = 0;
y < img->getHeight(); ++
y) {
226 for (
int x = 0;
x < img->getWidth(); ++
x) {
227 *out++ = img->getValue(
x,
y);
238 #endif // _SEFRAMEWORK_CONVOLUTION_DFT_H
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y