74 const float *
const restrict mask,
75 float *
const restrict
out,
90 float ming = 10000000.0f;
92 float minm = 10000000.0f;
94 float ming2 = 10000000.0f;
96 float minmg = 10000000.0f;
99#pragma omp parallel for default(none) \
100dt_omp_firstprivate(guide, mask, in, Ndim) \
101 schedule(simd:static) \
102 reduction(max:maxg, maxm, maxg2, maxmg)\
103 reduction(min:ming, minm, ming2, minmg)
105 for(
size_t k = 0; k < Ndim; k++)
107 const float pixelg = guide[k];
108 const float pixelm = mask[k];
109 const float pixelg2 = pixelg * pixelg;
110 const float pixelmg = pixelm * pixelg;
112 in[k * 4 + 1] = pixelg2;
113 in[k * 4 + 2] = pixelm;
114 in[k * 4 + 3] = pixelmg;
115 ming =
MIN(ming,pixelg);
116 maxg =
MAX(maxg,pixelg);
117 minm =
MIN(minm,pixelm);
118 maxm =
MAX(maxm,pixelm);
119 ming2 =
MIN(ming2,pixelg2);
120 maxg2 =
MAX(maxg2,pixelg2);
121 minmg =
MIN(minmg,pixelmg);
122 maxmg =
MAX(maxmg,pixelmg);
125 dt_aligned_pixel_t
max = {maxg, maxg2, maxm, maxmg};
126 dt_aligned_pixel_t
min = {ming, ming2, minm, minmg};
136#pragma omp parallel for simd default(none) \
137dt_omp_firstprivate(out, Ndim) \
138 schedule(simd:static) aligned(out:64)
140 for(
size_t k = 0; k < Ndim; k++)
142 out[4 * k + 1] -=
out[4 * k] *
out[4 * k];
143 out[4 * k + 3] -=
out[4 * k] *
out[4 * k + 2];
156 float *
const restrict
out,
171 float ming = 10000000.0f;
173 float ming2 = 10000000.0f;
176#pragma omp parallel for default(none) \
177dt_omp_firstprivate(guide, in, Ndim) \
178 schedule(simd:static) \
179 reduction(max:maxg, maxg2)\
180 reduction(min:ming, ming2)
182 for(
size_t k = 0; k < Ndim; k++)
184 const float pixelg = guide[k];
185 const float pixelg2 = pixelg * pixelg;
187 in[2 * k + 1] = pixelg2;
188 ming =
MIN(ming,pixelg);
189 maxg =
MAX(maxg,pixelg);
190 ming2 =
MIN(ming2,pixelg2);
191 maxg2 =
MAX(maxg2,pixelg2);
194 float max[2] = {maxg, maxg2};
195 float min[2] = {ming, ming2};
205#pragma omp parallel for simd default(none) \
206dt_omp_firstprivate(out, Ndim) \
207 schedule(simd:static) aligned(out:64)
209 for(
size_t k = 0; k < Ndim; k++)
211 const float avg =
out[2 * k];
212 out[2 * k + 1] -= avg * avg;
222static inline void eigf_blending(
float *
const restrict image,
const float *
const restrict mask,
223 const float *
const restrict av,
const size_t Ndim,
227#pragma omp parallel for simd default(none) \
228 dt_omp_firstprivate(image, mask, av, Ndim, feathering, filter) \
229 schedule(simd:static) aligned(image, mask, av:64)
231 for(
size_t k = 0; k < Ndim; k++)
233 const float avg_g = av[k * 4];
234 const float avg_m = av[k * 4 + 2];
235 const float var_g = av[k * 4 + 1];
236 const float covar_mg = av[k * 4 + 3];
237 const float norm_g = fmaxf(avg_g * image[k], 1
E-6);
238 const float norm_m = fmaxf(avg_m * mask[k], 1
E-6);
239 const float normalized_var_guide = var_g / norm_g;
240 const float normalized_covar = covar_mg / sqrtf(norm_g * norm_m);
241 const float a = normalized_covar / (normalized_var_guide + feathering);
242 const float b = avg_m -
a * avg_g;
251 image[k] = sqrtf(image[k]);
261 const float feathering)
264#pragma omp parallel for simd default(none) \
265 dt_omp_firstprivate(image, av, Ndim, feathering, filter) \
266 schedule(simd:static) aligned(image, av:64)
268 for(
size_t k = 0; k < Ndim; k++)
270 const float avg_g = av[k * 2];
271 const float var_g = av[k * 2 + 1];
272 const float norm_g = fmaxf(avg_g * image[k], 1
E-6);
273 const float normalized_var_guide = var_g / norm_g;
274 const float a = normalized_var_guide / (normalized_var_guide + feathering);
275 const float b = avg_g -
a * avg_g;
284 image[k] = sqrtf(image[k]);
292 const float sigma,
float feathering,
const int iterations,
294 const float quantization,
const float quantize_min,
const float quantize_max)
303 const float scaling = fmaxf(fminf(sigma, 4.0f), 1.0f);
304 const float ds_sigma = fmaxf(sigma /
scaling, 1.0f);
309 const size_t num_elem_ds = ds_width * ds_height;
319 if(!ds_image || !ds_mask || !ds_av || !av || !mask)
326 for(
int i = 0;
i < iterations;
i++)
331 if(
i == iterations - 1)
335 if(quantization != 0.0f)
static void error(char *msg)
Definition ashift_lsd.c:202
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static const float scaling
Definition chromatic_adaptation.h:299
const float i
Definition colorspaces_inline_conversions.h:669
const float g
Definition colorspaces_inline_conversions.h:925
static const float const float const float min
Definition colorspaces_inline_conversions.h:667
const float max
Definition colorspaces_inline_conversions.h:721
const float b
Definition colorspaces_inline_conversions.h:1326
const float a
Definition colorspaces_inline_conversions.h:1292
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
#define dt_pixelpipe_cache_alloc_align_float_cache(pixels, id)
Definition darktable.h:371
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:327
#define dt_pixelpipe_cache_free_align(mem)
Definition darktable.h:377
#define __DT_CLONE_TARGETS__
Definition darktable.h:291
static __DT_CLONE_TARGETS__ int eigf_variance_analysis(const float *const restrict guide, const float *const restrict mask, float *const restrict out, const size_t width, const size_t height, const float sigma)
Definition eigf.h:73
static __DT_CLONE_TARGETS__ int fast_eigf_surface_blur(float *const restrict image, const size_t width, const size_t height, const float sigma, float feathering, const int iterations, const dt_iop_guided_filter_blending_t filter, const float scale, const float quantization, const float quantize_min, const float quantize_max)
Definition eigf.h:290
static __DT_CLONE_TARGETS__ int eigf_variance_analysis_no_mask(const float *const restrict guide, float *const restrict out, const size_t width, const size_t height, const float sigma)
Definition eigf.h:155
static __DT_CLONE_TARGETS__ void eigf_blending_no_mask(float *const restrict image, const float *const restrict av, const size_t Ndim, const dt_iop_guided_filter_blending_t filter, const float feathering)
Definition eigf.h:259
static __DT_CLONE_TARGETS__ void eigf_blending(float *const restrict image, const float *const restrict mask, const float *const restrict av, const size_t Ndim, const dt_iop_guided_filter_blending_t filter, const float feathering)
Definition eigf.h:222
dt_iop_guided_filter_blending_t
Definition fast_guided_filter.h:51
@ DT_GF_BLENDING_LINEAR
Definition fast_guided_filter.h:52
static __DT_CLONE_TARGETS__ void quantize(const float *const restrict image, float *const restrict out, const size_t num_elem, const float sampling, const float clip_min, const float clip_max)
Definition fast_guided_filter.h:264
#define MIN_FLOAT
Definition fast_guided_filter.h:47
static __DT_CLONE_TARGETS__ void interpolate_bilinear(const float *const restrict in, const size_t width_in, const size_t height_in, float *const restrict out, const size_t width_out, const size_t height_out, const size_t ch)
Definition fast_guided_filter.h:103
void dt_gaussian_free(dt_gaussian_t *g)
Definition gaussian.c:514
void dt_gaussian_blur(dt_gaussian_t *g, const float *const in, float *const out)
Definition gaussian.c:173
void dt_gaussian_blur_4c(dt_gaussian_t *g, const float *const in, float *const out)
Definition gaussian.c:503
dt_gaussian_t * dt_gaussian_init(const int width, const int height, const int channels, const float *max, const float *min, const float sigma, const int order)
Definition gaussian.c:125
#define E
Definition test_filmicrgb.c:61
#define MIN(a, b)
Definition thinplate.c:32
#define MAX(a, b)
Definition thinplate.c:29