Blender V4.3
COM_CalculateStandardDeviationOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
8
10
11namespace blender::compositor {
12
14{
15 const float mean = this->calculate_mean(input);
16
17 PixelsSum total = {0};
19 input->get_rect(),
20 [=](const rcti &split) { return this->calc_area_sum(input, split, mean); },
21 total,
22 [](PixelsSum &join, const PixelsSum &chunk) {
23 join.sum += chunk.sum;
24 join.num_pixels += chunk.num_pixels;
25 });
26
27 return total.num_pixels <= 1 ? 0.0f : sqrt(total.sum / float(total.num_pixels - 1));
28}
29
31PixelsSum CalculateStandardDeviationOperation::calc_area_sum(const MemoryBuffer *input,
32 const rcti &area,
33 const float mean) const
34{
35 PixelsSum result = {0};
36 for (const float *elem : input->get_buffer_area(area)) {
37 if (elem[3] <= 0.0f) {
38 continue;
39 }
40 const float value = setting_func_(elem);
41 result.sum += (value - mean) * (value - mean);
42 result.num_pixels++;
43 }
44 return result;
45}
46
47} // namespace blender::compositor
sqrt(x)+1/max(0
static void split(const char *text, const char *seps, char ***str, int *count)
float calculate_mean(const MemoryBuffer *input) const
std::function< float(const float *elem)> setting_func_
void execute_work(const rcti &work_rect, std::function< void(const rcti &split_rect)> work_func)
a MemoryBuffer contains access to the data