89 if(border <= 0)
return;
91 #pragma omp parallel for simd default(none) \
92 dt_omp_firstprivate(mask) \
93 dt_omp_sharedconst(width, height, border) \
94 schedule(simd:static) aligned(mask : 64)
96 for(
int row = border; row <
height - border; row++)
98 const int idx = row *
width;
99 for(
int i = 0; i < border; i++)
101 mask[idx + i] = mask[idx + border];
102 mask[idx +
width - i - 1] = mask[idx +
width - border -1];
106 #pragma omp parallel for simd default(none) \
107 dt_omp_firstprivate(mask) \
108 dt_omp_sharedconst(width, height, border) \
109 schedule(simd:static) aligned(mask : 64)
111 for(
int col = 0; col <
width; col++)
113 const float top = mask[border *
width +
MIN(
width - border - 1,
MAX(col, border))];
115 for(
int i = 0; i < border; i++)
117 mask[col + i *
width] = top;
126 const float temp = -2.0f *
sqf(sigma);
127 const float range =
sqf(3.0f * 0.84f);
129 for(
int k = -2; k <= 2; k++)
131 for(
int j = -2; j <= 2; j++)
133 if((
sqf(k) +
sqf(j)) <= range)
136 sum +=
kernel[k + 2][j + 2];
139 kernel[k + 2][j + 2] = 0.0f;
142 for(
int i = 0; i < 5; i++)
147 for(
int j = 0; j < 5; j++)
156#define FAST_BLUR_5 ( \
157 blurmat[0] * ((src[i - w2 - 1] + src[i - w2 + 1]) + (src[i - w1 - 2] + src[i - w1 + 2]) + (src[i + w1 - 2] + src[i + w1 + 2]) + (src[i + w2 - 1] + src[i + w2 + 1])) + \
158 blurmat[1] * (src[i - w2] + src[i - 2] + src[i + 2] + src[i + w2]) + \
159 blurmat[2] * (src[i - w1 - 1] + src[i - w1 + 1] + src[i + w1 - 1] + src[i + w1 + 1]) + \
160 blurmat[3] * (src[i - w1] + src[i - 1] + src[i + 1] + src[i + w1]) + \
161 blurmat[4] * src[i] )
166 const float temp = -2.0f *
sqf(sigma);
167 const float range =
sqf(3.0f * 1.5f);
169 for(
int k = -4; k <= 4; k++)
171 for(
int j = -4; j <= 4; j++)
173 if((
sqf(k) +
sqf(j)) <= range)
176 sum +=
kernel[k + 4][j + 4];
179 kernel[k + 4][j + 4] = 0.0f;
182 for(
int i = 0; i < 9; i++)
187 for(
int j = 0; j < 9; j++)
205#define FAST_BLUR_9 ( \
206 blurmat[12] * (src[i - w4 - 2] + src[i - w4 + 2] + src[i - w2 - 4] + src[i - w2 + 4] + src[i + w2 - 4] + src[i + w2 + 4] + src[i + w4 - 2] + src[i + w4 + 2]) + \
207 blurmat[11] * (src[i - w4 - 1] + src[i - w4 + 1] + src[i - w1 - 4] + src[i - w1 + 4] + src[i + w1 - 4] + src[i + w1 + 4] + src[i + w4 - 1] + src[i + w4 + 1]) + \
208 blurmat[10] * (src[i - w4] + src[i - 4] + src[i + 4] + src[i + w4]) + \
209 blurmat[9] * (src[i - w3 - 3] + src[i - w3 + 3] + src[i + w3 - 3] + src[i + w3 + 3]) + \
210 blurmat[8] * (src[i - w3 - 2] + src[i - w3 + 2] + src[i - w2 - 3] + src[i - w2 + 3] + src[i + w2 - 3] + src[i + w2 + 3] + src[i + w3 - 2] + src[i + w3 + 2]) + \
211 blurmat[7] * (src[i - w3 - 1] + src[i - w3 + 1] + src[i - w1 - 3] + src[i - w1 + 3] + src[i + w1 - 3] + src[i + w1 + 3] + src[i + w3 - 1] + src[i + w3 + 1]) + \
212 blurmat[6] * (src[i - w3] + src[i - 3] + src[i + 3] + src[i + w3]) + \
213 blurmat[5] * (src[i - w2 - 2] + src[i - w2 + 2] + src[i + w2 - 2] + src[i + w2 + 2]) + \
214 blurmat[4] * (src[i - w2 - 1] + src[i - w2 + 1] + src[i - w1 - 2] + src[i - w1 + 2] + src[i + w1 - 2] + src[i + w1 + 2] + src[i + w2 - 1] + src[i + w2 + 1]) + \
215 blurmat[3] * (src[i - w2] + src[i - 2] + src[i + 2] + src[i + w2]) + \
216 blurmat[2] * (src[i - w1 - 1] + src[i - w1 + 1] + src[i + w1 - 1] + src[i + w1 + 1]) + \
217 blurmat[1] * (src[i - w1] + src[i - 1] + src[i + 1] + src[i + w1]) + \
218 blurmat[0] * src[i] )
230 #pragma omp parallel for simd default(none) \
231 dt_omp_firstprivate(blurmat, src, out) \
232 dt_omp_sharedconst(width, height, w1, w2, w3, w4) \
233 schedule(simd:static) aligned(src, out : 64)
235 for(
int row = 4; row <
height - 4; row++)
237 for(
int col = 4; col <
width - 4; col++)
239 const int i = row *
width + col;
249 const float temp = -2.0f *
sqf(sigma);
250 const float range =
sqf(3.0f * 2.0f);
252 for(
int k = -6; k <= 6; k++)
254 for(
int j = -6; j <= 6; j++)
256 if((
sqf(k) +
sqf(j)) <= range)
259 sum +=
kernel[k + 6][j + 6];
262 kernel[k + 6][j + 6] = 0.0f;
265 for(
int i = 0; i < 13; i++)
270 for(
int j = 0; j < 13; j++)
296 const int width,
const int height,
const dt_aligned_pixel_t wb)
300 #pragma omp parallel for simd default(none) \
301 dt_omp_firstprivate(tmp, src, msize, wb) \
302 schedule(simd:static) aligned(tmp, src : 64)
304 for(
int idx =0; idx < msize; idx++)
306 const float val = 0.333333333f * (fmaxf(src[4 * idx], 0.0f) / wb[0] + fmaxf(src[4 * idx + 1], 0.0f) / wb[1] + fmaxf(src[4 * idx + 2], 0.0f) / wb[2]);
307 tmp[idx] = sqrtf(val);
310 const float scale = 1.0f / 16.0f;
312 #pragma omp parallel for simd default(none) \
313 dt_omp_firstprivate(mask, tmp, width, height, scale) \
314 schedule(simd:static) aligned(mask, tmp : 64)
316 for(
int row = 1; row <
height - 1; row++)
318 for(
int col = 1, idx = row *
width + col; col <
width - 1; col++, idx++)
321 const float gx = 47.0f * (tmp[idx-
width-1] - tmp[idx-
width+1])
322 + 162.0f * (tmp[idx-1] - tmp[idx+1])
323 + 47.0f * (tmp[idx+
width-1] - tmp[idx+
width+1]);
324 const float gy = 47.0f * (tmp[idx-
width-1] - tmp[idx+
width-1])
326 + 47.0f * (tmp[idx-
width+1] - tmp[idx+
width+1]);
327 const float gradient_magnitude = sqrtf(
sqf(gx / 256.0f) +
sqf(gy / 256.0f));
328 mask[idx] = scale * gradient_magnitude;
342 return 1.0f / (1.0f +
dt_fast_expf(16.0f - (16.0f / threshold) * val));
345void dt_masks_calc_detail_mask(
float *
const restrict src,
float *
const restrict out,
float *
const restrict tmp,
const int width,
const int height,
const float threshold,
const gboolean detail)
349 #pragma omp parallel for simd default(none) \
350 dt_omp_firstprivate(src, tmp, msize, threshold, detail, out) \
351 schedule(simd:static) aligned(src, tmp, out : 64)
353 for(
int idx = 0; idx < msize; idx++)
356 tmp[idx] = detail ? blend : 1.0f - blend;
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static float kernel(const float *x, const float *y)
Definition colorchecker.c:435
void dt_masks_blur_9x9_coeff(float *c, const float sigma)
Definition detail.c:163
void dt_masks_blur_9x9(float *const restrict src, float *const restrict out, const int width, const int height, const float sigma)
Definition detail.c:220
void _masks_blur_13x13_coeff(float *c, const float sigma)
Definition detail.c:246
void dt_masks_extend_border(float *const restrict mask, const int width, const int height, const int border)
Definition detail.c:87
void dt_masks_calc_detail_mask(float *const restrict src, float *const restrict out, float *const restrict tmp, const int width, const int height, const float threshold, const gboolean detail)
Definition detail.c:345
static float calcBlendFactor(float val, float threshold)
Definition detail.c:337
void _masks_blur_5x5_coeff(float *c, const float sigma)
Definition detail.c:123
#define FAST_BLUR_9
Definition detail.c:205
void dt_masks_calc_rawdetail_mask(float *const restrict src, float *const restrict mask, float *const restrict tmp, const int width, const int height, const dt_aligned_pixel_t wb)
Definition detail.c:295
#define w2
Definition lmmse.c:61
#define w1
Definition lmmse.c:60
#define w4
Definition lmmse.c:63
#define w3
Definition lmmse.c:62
static float sqf(const float x)
Definition math.h:215
static float dt_fast_expf(const float x)
Definition math.h:282
#define MIN(a, b)
Definition thinplate.c:23
#define MAX(a, b)
Definition thinplate.c:20