| 84 | }; |
| 85 | |
| 86 | struct GaussianKernelFunc { |
| 87 | static constexpr float kRadiusMultiplier = 3.0f; |
| 88 | // https://en.wikipedia.org/wiki/Gaussian_function |
| 89 | // We use sigma = 0.5, as suggested on p. 4 of Ken Turkowski's "Filters |
| 90 | // for Common Resampling Tasks" for kernels with a support of 3 pixels: |
| 91 | // www.realitypixels.com/turk/computergraphics/ResamplingFilters.pdf |
| 92 | // This implies a radius of 1.5, |
| 93 | explicit GaussianKernelFunc(float _radius = 1.5f) |
| 94 | : radius(_radius), sigma(_radius / kRadiusMultiplier) {} |
| 95 | float operator()(float x) const { |
| 96 | x = std::abs(x); |
| 97 | if (x >= radius) return 0.0; |
| 98 | return std::exp(-x * x / (2.0 * sigma * sigma)); |
| 99 | } |
| 100 | float Radius() const { return radius; } |
| 101 | const float radius; |
| 102 | const float sigma; // Gaussian standard deviation |
| 103 | }; |
| 104 | |
| 105 | struct BoxKernelFunc { |
| 106 | float operator()(float x) const { |
no outgoing calls
no test coverage detected