ImagePreprocessor: Separate azint from preprocessing (later put azint on GPU!)

This commit is contained in:
2026-04-22 13:27:00 +02:00
parent d0446b453b
commit 9338a876fd
12 changed files with 59 additions and 45 deletions
@@ -5,18 +5,12 @@
#include "ImagePreprocessor.h"
ImagePreprocessor::ImagePreprocessor(const DiffractionExperiment &experiment,
const AzimuthalIntegration &integration,
const PixelMask &mask,
std::vector<int32_t> &processed_image)
: npixels(experiment.GetPixelsNum()),
experiment(experiment),
integration(integration),
azint_sum(integration.GetBinNumber(), 0.0),
azint_sum2(integration.GetBinNumber(), 0.0),
azint_count(integration.GetBinNumber(), 0),
processed_image(processed_image),
mask_1bit(npixels, false),
azint_bins(integration.GetBinNumber()),
saturation_limit(experiment.GetSaturationLimit()) {
if (processed_image.size() != npixels)
@@ -26,11 +20,6 @@ ImagePreprocessor::ImagePreprocessor(const DiffractionExperiment &experiment,
mask_1bit[i] = (mask.GetMask().at(i) != 0);
}
void ImagePreprocessor::Update(AzimuthalIntegrationProfile &profile) const {
profile.Clear(integration);
profile.Add(azint_sum, azint_count);
}
ImageStatistics ImagePreprocessor::Analyze(const uint8_t *image_ptr, CompressedImageMode image_mode) {
switch (image_mode) {
case CompressedImageMode::Int8:
@@ -54,20 +43,11 @@ template<class T>
ImageStatistics ImagePreprocessor::Analyze(const uint8_t *input, T err_pixel_val, T sat_pixel_val) {
auto image = reinterpret_cast<const T *>(input);
for (int i = 0; i < azint_count.size(); i++) {
azint_sum[i] = 0.0f;
azint_sum2[i] = 0.0f;
azint_count[i] = 0;
}
ImageStatistics ret{};
if (sat_pixel_val > saturation_limit)
sat_pixel_val = static_cast<T>(saturation_limit);
auto &pixel_to_bin = integration.GetPixelToBin();
auto &corrections = integration.Corrections();
for (int i = 0; i < npixels; i++) {
if (mask_1bit[i] != 0) {
processed_image[i] = INT32_MIN;
@@ -86,14 +66,34 @@ ImageStatistics ImagePreprocessor::Analyze(const uint8_t *input, T err_pixel_val
ret.max_value = image[i];
if (image[i] < ret.min_value)
ret.min_value = image[i];
const uint16_t bin = pixel_to_bin[i];
if (bin < azint_bins) {
float val = image[i] * corrections[i];
azint_sum[bin] += val;
++azint_count[bin];
}
}
}
return ret;
}
}
void ImagePreprocessor::AzimIntegration(const AzimuthalIntegration &integration, AzimuthalIntegrationProfile &profile) {
const auto azint_bins = integration.GetBinNumber();
std::vector<float> azint_sum(azint_bins);
std::vector<float> azint_sum2(azint_bins);
std::vector<uint32_t> azint_count(azint_bins);
for (int i = 0; i < azint_count.size(); i++) {
azint_sum[i] = 0.0f;
azint_sum2[i] = 0.0f;
azint_count[i] = 0;
}
auto &pixel_to_bin = integration.GetPixelToBin();
auto &corrections = integration.Corrections();
for (int i = 0; i < npixels; i++) {
const uint16_t bin = pixel_to_bin[i];
if (bin < azint_bins) {
float val = static_cast<float>(processed_image[i]) * corrections[i];
azint_sum[bin] += val;
++azint_count[bin];
}
}
profile.Clear(integration);
profile.Add(azint_sum, azint_count);
}