/* Convolve image with a Gaussian of width sigma and store result back in image. This routine creates the Gaussian kernel, and then applies it sequentially in horizontal and vertical directions. */ void GaussianBlur(SiftImage image, double sigma) { double x, kernel[100], sum = 0.0; int ksize, i; /* The Gaussian kernel is truncated at GaussTruncate sigmas from center. The kernel size should be odd. */ ksize = (int)(2.0 * GaussTruncate * sigma + 1.0); ksize = MAX_SIFT(3, ksize); /* Kernel must be at least 3. */ if (ksize % 2 == 0) /* Make kernel size odd. */ ksize++; assert(ksize < 100); /* Fill in kernel values. */ for (i = 0; i <= ksize; i++) { x = i - ksize / 2; kernel[i] = exp(- x * x / (2.0 * sigma * sigma)); sum += kernel[i]; } /* Normalize kernel values to sum to 1.0. */ for (i = 0; i < ksize; i++) kernel[i] /= sum; ConvHorizontal(image, kernel, ksize); ConvVertical(image, kernel, ksize); }
/* 1D Convolve image with a Gaussian of width sigma and store result back in image. This routine creates the Gaussian kernel, and then applies it in horizontal (flag_dir=0) OR vertical directions (flag_dir!=0). */ void GaussianBlur1D(vector<float>& image, int width, int height, float sigma, int flag_dir) { float x, kernel[100], sum = 0.0; int ksize, i; /* The Gaussian kernel is truncated at GaussTruncate sigmas from center. The kernel size should be odd. */ ksize = (int)(2.0 * GaussTruncate1 * sigma + 1.0); ksize = MAX(3, ksize); /* Kernel must be at least 3. */ if (ksize % 2 == 0) /* Make kernel size odd. */ ksize++; assert(ksize < 100); /* Fill in kernel values. */ for (i = 0; i <= ksize; i++) { x = i - ksize / 2; kernel[i] = exp(- x * x / (2.0 * sigma * sigma)); sum += kernel[i]; } /* Normalize kernel values to sum to 1.0. */ for (i = 0; i < ksize; i++) kernel[i] /= sum; if (flag_dir == 0) { ConvHorizontal(image, width, height, kernel, ksize); } else { ConvVertical(image, width, height, kernel, ksize); } }
/* Convolve image with a Gaussian of width sigma and store result back in image. This routine creates the Gaussian kernel, and then applies it sequentially in horizontal and vertical directions. */ void gauss_convol(LWImage<flnum>& image, flnum sigma) { /*float x, kernel[100], sum = 0.0;*/ flnum x, kernel[1000], sum = 0.0; /*TANG*/ int ksize, i; /* The Gaussian kernel is truncated at GaussTruncate sigmas from center. The kernel size should be odd. */ ksize = (int)(2.0 * GaussTruncate * sigma + 1.0); /*ksize = MAX(3, ksize);*/ /* Kernel must be at least 3. */ ksize = ksize > 3 ? ksize : 3; if (ksize % 2 == 0) /* Make kernel size odd. */ ksize++; /*assert(ksize < 100);*/ assert(ksize < 1000); /*TANG*/ /* Fill in kernel values. */ for (i = 0; i <= ksize; i++) { x = i - ksize/2; kernel[i] = exp(- x * x / (2 * sigma * sigma)); sum += kernel[i]; } /* Normalize kernel values to sum to 1.0. */ for (i = 0; i < ksize; i++) kernel[i] /= sum; ConvHorizontal(image, kernel, ksize); ConvVertical(image, kernel, ksize); }