SourceXtractorPlusPlus  0.12
Please provide a description of the project.
BgDFTConvolutionImageSource.cpp
Go to the documentation of this file.
1 
17 /*
18  * BgDFTConvolutionImageSource.h
19  *
20  * Created on: Jun 12, 2019
21  * Author: Alejandro Alvarez
22  * Refactored out from: BackgroundConvolution.h
23  */
24 
28 
29 namespace SourceXtractor {
30 
31 
33  std::shared_ptr<DetectionImage> variance, SeFloat threshold,
35  : ProcessingImageSource<DetectionImage::PixelType>(image),
36  m_variance(variance), m_threshold(threshold), m_convolution(kernel) {
37 }
38 
40  return "BgDFTConvolutionImageSource(" + getImageRepr() + ")";
41 }
42 
45  int start_x, int start_y, int width, int height) const {
46  int hx = m_convolution.getWidth() / 2;
47  int hy = m_convolution.getHeight() / 2;
48  int clip_x = std::max(start_x - hx, 0);
49  int clip_y = std::max(start_y - hy, 0);
50  int clip_w = std::min(width + hx * 2, image->getWidth() - clip_x);
51  int clip_h = std::min(height + hy * 2, image->getHeight() - clip_y);
52 
53  // Clip the image and variance map to the given size, accounting for the margins for the convolution
55  clip_w, clip_h, [image, clip_x, clip_y](int x, int y) {
56  return image->getValue(clip_x + x, clip_y + y);
57  }
58  );
60  clip_w, clip_h, [this, clip_x, clip_y](int x, int y) {
61  return m_variance->getValue(clip_x + x, clip_y + y);
62  }
63  );
64 
65  // Get the mask
66  // For instance, with a threshold of 0.5
67  // Variance Mask Negative
68  // 1 1 1 0 0 0 1 1 1
69  // 1 0 1 0 1 0 1 0 1
70  // 1 1 1 0 0 0 1 1 1
72  clipped_variance->getWidth(), clipped_variance->getHeight(),
73  [this, clipped_variance](int x, int y) -> DetectionImage::PixelType {
74  return clipped_variance->getValue(x, y) < m_threshold;
75  }
76  );
77 
78  // Get the image masking out values where the variance is greater than the threshold
79  auto masked_img = MultiplyImage<DetectionImage::PixelType>::create(clipped_img, mask);
80 
81  // Convolve the masked image, padding with 0
82  auto conv_masked = VectorImage<DetectionImage::PixelType>::create(masked_img);
83  m_convolution.convolve(conv_masked);
84 
85  // Convolve the mask
86  // This gives us in each cell the sum of the kernel values that have been used,
87  // so we can divide the previous convolution.
89  m_convolution.convolve(conv_mask);
90 
91  // Copy out the value of the convolved image, divided by the negative mask, applying
92  // again the mask to the convolved result
93  int off_x = start_x - clip_x;
94  int off_y = start_y - clip_y;
95  for (int y = 0; y < height; ++y) {
96  for (int x = 0; x < width; ++x) {
97  if (mask->getValue(x + off_x, y + off_y)) {
98  tile.setValue(
99  x + start_x, y + start_y,
100  conv_masked->getValue(x + off_x, y + off_y) / conv_mask->getValue(x + off_x, y + off_y)
101  );
102  } else {
103  tile.setValue(x + start_x, y + start_y, 0);
104  }
105  }
106  }
107 }
108 
109 } // end namespace SourceXtractor
110 
void convolve(std::shared_ptr< WriteableImage< T >> image_ptr, std::unique_ptr< ConvolutionContext > &context, Args... padding_args) const
Definition: DFT.h:151
std::size_t getHeight() const
Definition: DFT.h:92
int getWidth() const final
Returns the width of the image in pixels.
std::size_t getWidth() const
Definition: DFT.h:84
static std::shared_ptr< ImageBase< T > > create(Args &&... args)
void setValue(int x, int y, T value)
Definition: ImageTile.h:81
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
SeFloat32 SeFloat
Definition: Types.h:32
int getHeight() const final
Returns the height of the image in pixels.
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
STL class.
T min(T... args)
Image implementation which keeps the pixel values in memory.
Definition: VectorImage.h:53
static std::shared_ptr< VectorImage< T > > create(Args &&... args)
Definition: VectorImage.h:89
T max(T... args)
T getValue(int x, int y) const final
Returns the value of the pixel with the coordinates (x,y)
void generateTile(const std::shared_ptr< Image< DetectionImage::PixelType >> &image, ImageTile< DetectionImage::PixelType > &tile, int start_x, int start_y, int width, int height) const override
BgDFTConvolutionImageSource(std::shared_ptr< Image< DetectionImage::PixelType >> image, std::shared_ptr< DetectionImage > variance, SeFloat threshold, std::shared_ptr< VectorImage< SeFloat >> kernel)
Interface representing an image.
Definition: Image.h:43
std::string getRepr() const override
Human readable representation of this source.
static std::shared_ptr< ProcessedImage< T, P > > create(std::shared_ptr< const Image< T >> image_a, std::shared_ptr< const Image< T >> image_b)