23 #ifndef _SEFRAMEWORK_CONVOLUTION_DIRECTCONVOLUTION_H 24 #define _SEFRAMEWORK_CONVOLUTION_DIRECTCONVOLUTION_H 32 template <
typename T = SeFloat,
class TPadding = PaddedImage<T, Reflect101Coordinates>>
41 template <
typename ...Args>
43 auto padded_width = image->getWidth() +
m_kernel->getWidth() - 1;
44 auto padded_height = image->getHeight() +
m_kernel->getHeight() - 1;
45 auto lpad =
m_kernel->getWidth() / 2;
46 auto tpad =
m_kernel->getHeight() / 2;
49 TPadding::create(image, padded_width, padded_height, std::forward<Args>(padding_args)...)
52 for (
int iy = tpad; iy < padded->getHeight() - tpad; ++iy) {
53 for (
int ix = lpad; ix < padded->getWidth() - lpad; ++ix) {
55 for (
int ky = 0; ky <
m_kernel->getHeight(); ++ky) {
56 for (
int kx = 0; kx <
m_kernel->getWidth(); ++kx) {
57 acc +=
m_kernel->getValue(kx, ky) * padded->getValue(ix - lpad + kx, iy - tpad + ky);
60 image->setValue(ix - lpad, iy - tpad, acc);
83 #endif // _SEFRAMEWORK_CONVOLUTION_DIRECTCONVOLUTION_H