diff --git a/src/kernel.c b/src/kernel.c index 07d810c..b5a4948 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -121,4 +121,24 @@ void sum_kernel_preprocess(conv *map) { } } +/** + * Normalize a convolution kernel. + * + * @param[in,out] kern the kernel + */ +void normalize_conv_kern(conv *kern) { + double sum = 0.0; + for (int i = 0; i < kern->w * kern->h; i++) { + sum += kern->data[i]; + } + double factor = 1.0 / sum; + for (int i = 0; i < kern->w * kern->h; i++) { + kern->data[i] *= factor; + } + if (kern->rsum) { + free(kern->rsum); + kern->rsum = NULL; + } +} + // vim: set noet sw=8 ts=8 : diff --git a/src/kernel.h b/src/kernel.h index daf60d6..23dc38d 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -25,6 +25,13 @@ conv *gaussian_kernel(double r); /// shadow_sum[x*d+y] is the sum of the kernel from (0, 0) to (x, y), inclusive void sum_kernel_preprocess(conv *map); +/** + * Normalize a convolution kernel. + * + * @param[in,out] kern the kernel + */ +void normalize_conv_kern(conv *kern); + static inline void free_conv(conv *k) { free(k->rsum); free(k);