低通滤波器与单位积分

3
在图像处理中,特别是在指纹识别中,我需要应用一个二维低通滤波器,并且滤波器的积分为单位。

这里的“单位积分”是什么意思?另外,如果我选择高斯滤波器,应该使用什么sigma值?

1个回答

6

单位积分意味着掩模或核的总面积应为1。例如,3 x 3平均滤波器意味着您掩模中的每个系数都应为1/9。当您加总掩模中的所有元素时,它们加起来等于1。

Gaussian滤波器本质上具有单位积分/单位面积为1。如果您使用MATLAB,则使用gaussian标志的fspecial命令会使其掩模归一化。

但是,如果您想要自己创建高斯掩模,则可以使用以下方程:

Gaussian 2D Equation

请记住,(x,y)是相对于中心在掩模内部的位置。因此,如果您有一个5 x 5的掩模,则在row = 2, col = 2处,x = 0y = 0。然而,上述方程不会生成单位面积为1。在理论上,如果您对整个2D平面进行积分,它理论上等于1。由于我们正在截断高斯函数,因此面积不是1。因此,一旦生成所有系数,您需要确保总面积为1,方法是将掩模中的每个单独元素相加。然后,您将此数字除以掩模中的每个单独元素。实际上,在生成高斯掩模时,将指数项乘以方程中的比例因子并不重要。通过确保掩模的总和等于1,可以有效地消除比例。您只需使用指数项即可节省一些计算。

sigma而言,完全取决于您。通常,人们遵循3*sigma半宽度规则,因此在1D中从左到右的总宽度为6*sigma + 1(包括中心)。为了确定您想要的具体sigma值,人们会找出图像中最小特征的宽度,将其设置为宽度,然后从那里计算出sigma。例如,如果最大宽度为13,则在方程中重新排列sigma可得2。换句话说:

13 = 6*sigma + 1
12 = 6*sigma
sigma = 2

因此,您需要将sigma设置为2,并使掩模为13 x 13。有关3 * sigma规则的更多信息,请在此处查看我对该主题的帖子:如何在Matlab中设置高斯滤波器的大小? 创建掩模后,使用任何卷积方法对图像进行高斯滤波。
如果您可以使用MATLAB,则以下另一篇帖子可能会对您有所帮助。 如何在Matlab中制作高斯滤波器
如果您需要使用其他语言,例如C或Java,则可以按以下方式创建高斯掩模:

C / C ++

#define WIDTH 13

float sigma = ((float)WIDTH - 1.0f) / 6.0f;
int half_width = (int)(WIDTH / 2.0);
float mask[WIDTH][WIDTH];
float scale = 0.0f;
for (int i = -half_width; i <= half_width; i++) {
    for(int j = -half_width; j <= half_width; j++) {
         mask[i+half_width][j+half_width] = expf( -((float)(i*i + j*j) / (2.0*sigma*sigma)) );
         scale += mask[i+half_width][j+half_width];
    }
}

 for (int i = 0; i < WIDTH; i++)
      for (int j = 0; j < WIDTH; j++)
            mask[i][j] /= scale;

Java

 int WIDTH = 13;     
 float sigma = ((float)WIDTH - 1.0f) / 6.0f);
 int half_width = Math.floor((float)WIDTH / 2.0f);
 float[][] mask = new float[WIDTH][WIDTH];
 float scale = 0.0f;

 for (int i = -half_width; i <= half_width; i++) {
     for (int j = -half_width; j <= half_width; j++) {
          mask[i+half_width][j+half_width] = (float) Math.exp( -((double)(i*i + j*j) /  (2.0*sigma*sigma)) );
          scale += mask[i+half_width][j+half_width];
     }
 }

 for (int i = 0; i < WIDTH; i++)
      for (int j = 0; j < WIDTH; j++)
            mask[i][j] /= scale;

如我之前所述,注意在代码中我不必除以2*pi*sigma^2。再次强调的原因是,在对核进行归一化时,这个常数因子会被抵消掉,因此在计算掩模系数时没有必要增加额外的开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接