From ed9c7064de4d2c08aa1a00edd6eb0fcb5eaafb32 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Wed, 20 Feb 2019 01:46:54 +0000 Subject: [PATCH] Add helper function for kernel normalization Signed-off-by: Yuxuan Shui --- src/kernel.c | 20 ++++++++++++++++++++ src/kernel.h | 7 +++++++ 2 files changed, 27 insertions(+) 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);