低通滤波器,带单元积分

Tuc*_*Toc 2 image image-processing gaussian filter

在图像处理中,特别是在指纹识别中,我必须应用具有单位积分的二维低通滤波器.

这个单位积分是什么意思?另外,如果我选择高斯滤波器,使用什么西格玛?

ray*_*ica 6

单位积分意味着掩模或内核的总面积应为1.例如,3 x 3平均滤波器意味着掩模中的每个系数应为1/9.当你总结掩码中的所有元素时,它会加1.

高斯滤波器固有的单位积分/单位面积为1.如果使用MATLAB,fspecial带有gaussian标志的命令会对其掩码进行归一化.

但是,如果您想自己创建高斯蒙版,可以使用以下等式:

高斯二维方程

请记住,(x,y)掩模内部相对于中心的位置.因此,如果你有一个5 x 5的面具,那么at 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
Run Code Online (Sandbox Code Playgroud)

因此,你将你的设置设置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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,请注意在代码中我没有必要除以2*pi*sigma^2.同样,原因是因为当您对内核进行规范化时,此常量因子无论如何都会被取消,因此在计算掩码系数时无需添加任何额外开销.