SourceXtractorPlusPlus 1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
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
30
31namespace SourceXtractor {
32
33
40
42 return "BgDFTConvolutionImageSource(" + getImageRepr() + ")";
43}
44
47 int start_y, int width, int height) const {
48 int hx = m_convolution.getWidth() / 2;
49 int hy = m_convolution.getHeight() / 2;
50 int clip_x = std::max(start_x - hx, 0);
51 int clip_y = std::max(start_y - hy, 0);
52 int clip_w = std::min(width + hx * 2, image->getWidth() - clip_x);
53 int clip_h = std::min(height + hy * 2, image->getHeight() - clip_y);
54
55 using VarianceAccessor = ImageAccessor<WeightImage::PixelType>;
56
57 // Clip the image and variance map to the given size, accounting for the margins for the convolution
59 image, clip_x, clip_y, clip_w, clip_h
60 );
61 auto clipped_variance = SubImage<WeightImage::PixelType>::create(
62 m_variance, clip_x, clip_y, clip_w, clip_h
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, [this](int, int, WeightImage::PixelType v) {
73 return v < m_threshold;
74 }
75 );
76 VarianceAccessor maskAccessor(mask);
77
78 // Get the image masking out values where the variance is greater than the threshold
80 clipped_img, mask, 0., 0.);
81
82 // Convolve the masked image, padding with 0
83 auto conv_masked = VectorImage<DetectionImage::PixelType>::create(masked_img);
84 m_convolution.convolve(conv_masked);
85
86 // Convolve the mask
87 // This gives us in each cell the sum of the kernel values that have been used,
88 // so we can divide the previous convolution.
90 m_convolution.convolve(conv_mask);
91
92 // Copy out the value of the convolved image, divided by the negative mask, applying
93 // again the mask to the convolved result
94 int off_x = start_x - clip_x;
95 int off_y = start_y - clip_y;
96 for (int y = 0; y < height; ++y) {
97 for (int x = 0; x < width; ++x) {
98 if (maskAccessor.getValue(x + off_x, y + off_y)) {
99 tile.setValue(
100 x + start_x, y + start_y,
101 conv_masked->getValue(x + off_x, y + off_y) / conv_mask->getValue(x + off_x, y + off_y)
102 );
103 } else {
104 tile.setValue(x + start_x, y + start_y, 0);
105 }
106 }
107 }
108}
109
110} // end namespace SourceXtractor
111
std::string getRepr() const override
Human readable representation of this source.
void generateTile(const std::shared_ptr< Image< DetectionImage::PixelType > > &image, ImageTileWithType< 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)
static std::shared_ptr< FunctionalImage< T, I > > create(Args &&... args)
void setValue(int x, int y, float value) override
Definition ImageTile.h:214
Interface representing an image.
Definition Image.h:44
static std::shared_ptr< MaskedImage< T, M, Operator > > create(const std::shared_ptr< Image< T > > &image, const std::shared_ptr< Image< M > > &mask, T replacement, M mask_flag=0x01)
Definition MaskedImage.h:78
ProcessingImageSource(std::shared_ptr< Image< DetectionImage::PixelType > > image)
static std::shared_ptr< SubImage< T > > create(Args &&... args)
Definition SubImage.h:55
Image implementation which keeps the pixel values in memory.
Definition VectorImage.h:52
static std::shared_ptr< VectorImage< T > > create(Args &&... args)
T max(T... args)
T min(T... args)
SeFloat32 SeFloat
Definition Types.h:32
Image< SeFloat > DetectionImage
Alias for the detection image, to make easier its type modification.
Definition Image.h:80