Few problems:
Your Gaussian misses brackets (even though you already have plenty..) around 2 * pow( sigma, 2 )
. Now you multiply by variance instead of divide.
But what your problem is, is that your gaussian is centered at kx = ky = 0
, as you let it run from 0
to kernel_size
, instead of from -kernel_limit
to kernel_limit
. This results in the diagonal blurring. Something like the following should work better
kx = -kernel_limit;
ky = -kernel_limit;
int kernel_size_sq = kernel_size * kernel_size;
for( int i = 0; i < kernel_size_sq; i++ )
{
double sigma_sq = sigma * sigma;
double kx_sq = kx * kx;
double ky_sq = ky * ky;
kernel[i] = 1.0 / ( 2 * pi * sigma_sq) * exp(-(kx_sq + ky_sq) / (2 * sigma_sq));
if(kx == kernel_limit )
{
kx = -kernel_limit;
ky++;
}
else
{
kx++;
}
}
Also note how I got rid of your lisp-ness and some improvements: use some intermediate variables for clarity (compiler will optimize them away if anyway you ask it to); simple multiplication is faster than pow(x, 2)
; pow(e, x) == exp(x)
.