1- // More: http://ex2tron.wang
1+ // ex2tron's blog:
2+ // http://ex2tron.wang
23
3- cv::Mat cv::getGaussianKernel ( int n, double sigma, int ktype )
4+ cv::Mat cv::getGaussianKernel (int n, double sigma, int ktype)
45{
56 // 对于常见的卷积核,无需计算,直接查表
67 const int SMALL_GAUSSIAN_SIZE = 7 ;
78 static const float small_gaussian_tab[][SMALL_GAUSSIAN_SIZE] =
8- {
9- {1 .f },
10- {0 .25f , 0 .5f , 0 .25f },
11- {0 .0625f , 0 .25f , 0 .375f , 0 .25f , 0 .0625f },
12- {0 .03125f , 0 .109375f , 0 .21875f , 0 .28125f , 0 .21875f , 0 .109375f , 0 .03125f }
13- };
9+ {
10+ {1 .f },
11+ {0 .25f , 0 .5f , 0 .25f },
12+ {0 .0625f , 0 .25f , 0 .375f , 0 .25f , 0 .0625f },
13+ {0 .03125f , 0 .109375f , 0 .21875f , 0 .28125f , 0 .21875f , 0 .109375f , 0 .03125f }};
1414
15- const float * fixed_kernel = n % 2 == 1 && n <= SMALL_GAUSSIAN_SIZE && sigma <= 0 ?
16- small_gaussian_tab[n>>1 ] : 0 ;
15+ const float *fixed_kernel = n % 2 == 1 && n <= SMALL_GAUSSIAN_SIZE && sigma <= 0 ? small_gaussian_tab[n >> 1 ] : 0 ;
1716
18- CV_Assert ( ktype == CV_32F || ktype == CV_64F );
17+ CV_Assert (ktype == CV_32F || ktype == CV_64F);
1918 Mat kernel (n, 1 , ktype);
20- float * cf = kernel.ptr <float >();
21- double * cd = kernel.ptr <double >();
19+ float * cf = kernel.ptr <float >();
20+ double * cd = kernel.ptr <double >();
2221
2322 // sigma大于0和小于0两种情况
24- double sigmaX = sigma > 0 ? sigma : ((n- 1 )* 0.5 - 1 )* 0.3 + 0.8 ;
25- double scale2X = -0.5 / (sigmaX* sigmaX);
23+ double sigmaX = sigma > 0 ? sigma : ((n - 1 ) * 0.5 - 1 ) * 0.3 + 0.8 ;
24+ double scale2X = -0.5 / (sigmaX * sigmaX);
2625 double sum = 0 ;
2726
2827 int i;
29- for ( i = 0 ; i < n; i++ )
28+ for ( i = 0 ; i < n; i++)
3029 {
31- double x = i - (n- 1 )* 0.5 ;
32- double t = fixed_kernel ? (double )fixed_kernel[i] : std::exp (scale2X*x* x);
33- if ( ktype == CV_32F )
30+ double x = i - (n - 1 ) * 0.5 ;
31+ double t = fixed_kernel ? (double )fixed_kernel[i] : std::exp (scale2X * x * x);
32+ if ( ktype == CV_32F)
3433 {
3534 cf[i] = (float )t;
3635 sum += cf[i];
@@ -43,11 +42,11 @@ cv::Mat cv::getGaussianKernel( int n, double sigma, int ktype )
4342 }
4443
4544 // 计算并乘以缩放系数α
46- sum = 1 ./ sum;
47- for ( i = 0 ; i < n; i++ )
45+ sum = 1 . / sum;
46+ for ( i = 0 ; i < n; i++)
4847 {
49- if ( ktype == CV_32F )
50- cf[i] = (float )(cf[i]* sum);
48+ if ( ktype == CV_32F)
49+ cf[i] = (float )(cf[i] * sum);
5150 else
5251 cd[i] *= sum;
5352 }
0 commit comments