1
- // More: http://ex2tron.wang
1
+ // ex2tron's blog:
2
+ // http://ex2tron.wang
2
3
3
- cv::Mat cv::getGaussianKernel ( int n, double sigma, int ktype )
4
+ cv::Mat cv::getGaussianKernel (int n, double sigma, int ktype)
4
5
{
5
6
// 对于常见的卷积核,无需计算,直接查表
6
7
const int SMALL_GAUSSIAN_SIZE = 7 ;
7
8
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 }};
14
14
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 ;
17
16
18
- CV_Assert ( ktype == CV_32F || ktype == CV_64F );
17
+ CV_Assert (ktype == CV_32F || ktype == CV_64F);
19
18
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 >();
22
21
23
22
// 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);
26
25
double sum = 0 ;
27
26
28
27
int i;
29
- for ( i = 0 ; i < n; i++ )
28
+ for ( i = 0 ; i < n; i++)
30
29
{
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)
34
33
{
35
34
cf[i] = (float )t;
36
35
sum += cf[i];
@@ -43,11 +42,11 @@ cv::Mat cv::getGaussianKernel( int n, double sigma, int ktype )
43
42
}
44
43
45
44
// 计算并乘以缩放系数α
46
- sum = 1 ./ sum;
47
- for ( i = 0 ; i < n; i++ )
45
+ sum = 1 . / sum;
46
+ for ( i = 0 ; i < n; i++)
48
47
{
49
- if ( ktype == CV_32F )
50
- cf[i] = (float )(cf[i]* sum);
48
+ if ( ktype == CV_32F)
49
+ cf[i] = (float )(cf[i] * sum);
51
50
else
52
51
cd[i] *= sum;
53
52
}
0 commit comments