70 const float *
const restrict mask,
71 float *
const restrict out,
79 if(in == NULL)
goto error;
81 float ming = 10000000.0f;
83 float minm = 10000000.0f;
85 float ming2 = 10000000.0f;
87 float minmg = 10000000.0f;
90#pragma omp parallel for default(none) \
91dt_omp_firstprivate(guide, mask, in, Ndim) \
92 schedule(simd:static) \
93 reduction(max:maxg, maxm, maxg2, maxmg)\
94 reduction(min:ming, minm, ming2, minmg)
96 for(
size_t k = 0; k < Ndim; k++)
98 const float pixelg = guide[k];
99 const float pixelm = mask[k];
100 const float pixelg2 = pixelg * pixelg;
101 const float pixelmg = pixelm * pixelg;
103 in[k * 4 + 1] = pixelg2;
104 in[k * 4 + 2] = pixelm;
105 in[k * 4 + 3] = pixelmg;
106 ming =
MIN(ming,pixelg);
107 maxg =
MAX(maxg,pixelg);
108 minm =
MIN(minm,pixelm);
109 maxm =
MAX(maxm,pixelm);
110 ming2 =
MIN(ming2,pixelg2);
111 maxg2 =
MAX(maxg2,pixelg2);
112 minmg =
MIN(minmg,pixelmg);
113 maxmg =
MAX(maxmg,pixelmg);
116 dt_aligned_pixel_t max = {maxg, maxg2, maxm, maxmg};
117 dt_aligned_pixel_t min = {ming, ming2, minm, minmg};
119 if(g == NULL)
goto error;
123#pragma omp parallel for simd default(none) \
124dt_omp_firstprivate(out, Ndim) \
125 schedule(simd:static) aligned(out:64)
127 for(
size_t k = 0; k < Ndim; k++)
129 out[4 * k + 1] -= out[4 * k] * out[4 * k];
130 out[4 * k + 3] -= out[4 * k] * out[4 * k + 2];
141 float *
const restrict out,
149 if(in == NULL)
goto error;
151 float ming = 10000000.0f;
153 float ming2 = 10000000.0f;
156#pragma omp parallel for default(none) \
157dt_omp_firstprivate(guide, in, Ndim) \
158 schedule(simd:static) \
159 reduction(max:maxg, maxg2)\
160 reduction(min:ming, ming2)
162 for(
size_t k = 0; k < Ndim; k++)
164 const float pixelg = guide[k];
165 const float pixelg2 = pixelg * pixelg;
167 in[2 * k + 1] = pixelg2;
168 ming =
MIN(ming,pixelg);
169 maxg =
MAX(maxg,pixelg);
170 ming2 =
MIN(ming2,pixelg2);
171 maxg2 =
MAX(maxg2,pixelg2);
174 float max[2] = {maxg, maxg2};
175 float min[2] = {ming, ming2};
181#pragma omp parallel for simd default(none) \
182dt_omp_firstprivate(out, Ndim) \
183 schedule(simd:static) aligned(out:64)
185 for(
size_t k = 0; k < Ndim; k++)
187 const float avg = out[2 * k];
188 out[2 * k + 1] -= avg * avg;
196static inline void eigf_blending(
float *
const restrict image,
const float *
const restrict mask,
197 const float *
const restrict av,
const size_t Ndim,
201#pragma omp parallel for simd default(none) \
202 dt_omp_firstprivate(image, mask, av, Ndim, feathering, filter) \
203 schedule(simd:static) aligned(image, mask, av:64)
205 for(
size_t k = 0; k < Ndim; k++)
207 const float avg_g = av[k * 4];
208 const float avg_m = av[k * 4 + 2];
209 const float var_g = av[k * 4 + 1];
210 const float covar_mg = av[k * 4 + 3];
211 const float norm_g = fmaxf(avg_g * image[k], 1
E-6);
212 const float norm_m = fmaxf(avg_m * mask[k], 1
E-6);
213 const float normalized_var_guide = var_g / norm_g;
214 const float normalized_covar = covar_mg / sqrtf(norm_g * norm_m);
215 const float a = normalized_covar / (normalized_var_guide + feathering);
216 const float b = avg_m - a * avg_g;
219 image[k] = fmaxf(image[k] * a + b,
MIN_FLOAT);
224 image[k] *= fmaxf(image[k] * a + b,
MIN_FLOAT);
225 image[k] = sqrtf(image[k]);
234 const float feathering)
237#pragma omp parallel for simd default(none) \
238 dt_omp_firstprivate(image, av, Ndim, feathering, filter) \
239 schedule(simd:static) aligned(image, av:64)
241 for(
size_t k = 0; k < Ndim; k++)
243 const float avg_g = av[k * 2];
244 const float var_g = av[k * 2 + 1];
245 const float norm_g = fmaxf(avg_g * image[k], 1
E-6);
246 const float normalized_var_guide = var_g / norm_g;
247 const float a = normalized_var_guide / (normalized_var_guide + feathering);
248 const float b = avg_g - a * avg_g;
251 image[k] = fmaxf(image[k] * a + b,
MIN_FLOAT);
256 image[k] *= fmaxf(image[k] * a + b,
MIN_FLOAT);
257 image[k] = sqrtf(image[k]);
265 const float sigma,
float feathering,
const int iterations,
267 const float quantization,
const float quantize_min,
const float quantize_max)
274 const float scaling = fmaxf(fminf(sigma, 4.0f), 1.0f);
275 const float ds_sigma = fmaxf(sigma / scaling, 1.0f);
277 const size_t ds_height =
height / scaling;
278 const size_t ds_width =
width / scaling;
280 const size_t num_elem_ds = ds_width * ds_height;
290 if(!ds_image || !ds_mask || !ds_av || !av || !mask)
292 dt_control_log(_(
"fast exposure independent guided filter failed to allocate memory, check your RAM settings"));
297 for(
int i = 0; i < iterations; i++)
302 if(i == iterations - 1)
306 if(quantization != 0.0f)
static void error(char *msg)
Definition ashift_lsd.c:191
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
void dt_control_log(const char *msg,...)
Definition control.c:424
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:285
#define __DT_CLONE_TARGETS__
Definition darktable.h:249
#define dt_free_align(A)
Definition darktable.h:334
static void * dt_alloc_sse_ps(size_t pixels)
Definition darktable.h:356
static 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:232
static void 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:69
static void 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:140
static __DT_CLONE_TARGETS__ void 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:263
static 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:196
dt_iop_guided_filter_blending_t
Definition fast_guided_filter.h:44
@ DT_GF_BLENDING_LINEAR
Definition fast_guided_filter.h:45
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:254
#define MIN_FLOAT
Definition fast_guided_filter.h:40
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:97
void dt_gaussian_free(dt_gaussian_t *g)
Definition gaussian.c:497
void dt_gaussian_blur(dt_gaussian_t *g, const float *const in, float *const out)
Definition gaussian.c:156
void dt_gaussian_blur_4c(dt_gaussian_t *g, const float *const in, float *const out)
Definition gaussian.c:486
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:114
#define E
Definition test_filmicrgb.c:48
#define MIN(a, b)
Definition thinplate.c:23
#define MAX(a, b)
Definition thinplate.c:20