File: tophatconvolution.cpp

package info (click to toggle)
wsclean 3.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,296 kB
  • sloc: cpp: 129,246; python: 22,066; sh: 360; ansic: 230; makefile: 185
file content (39 lines) | stat: -rw-r--r-- 1,244 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "tophatconvolution.h"

#include <schaapcommon/math/convolution.h>

using aocommon::Image;

namespace wsclean::tophat_convolution {

Image MakeTopHatImage(size_t width, size_t height, double tophat_radius) {
  const ssize_t radius_squared =
      static_cast<size_t>(tophat_radius * tophat_radius);
  const ssize_t x_mid = (width - 1) / 2;
  const ssize_t y_mid = (height - 1) / 2;
  Image result(width, height, 0.0);
  size_t sum = 0;
  for (ssize_t y = 0; y != static_cast<ssize_t>(height); ++y) {
    float* result_row = &result[y * width];
    const ssize_t dy = y - y_mid;
    for (ssize_t x = 0; x != static_cast<ssize_t>(width); ++x) {
      const ssize_t dx = x - x_mid;
      if (dx * dx + dy * dy <= radius_squared) {
        result_row[x] = 1.0;
        ++sum;
      }
    }
  }
  result *= 1.0f / sum;
  return result;
}

void Convolve(Image& input, double radius) {
  size_t kernel_size = static_cast<size_t>(std::floor(radius)) * 2 + 1;
  if (kernel_size % 2 == 0) ++kernel_size;
  const Image kernel = MakeTopHatImage(kernel_size, kernel_size, radius);
  schaapcommon::math::ResizeAndConvolve(
      input.Data(), input.Width(), input.Height(), kernel.Data(), kernel_size);
}

}  // namespace wsclean::tophat_convolution