在图像处理中,特别是在指纹识别中,我需要应用一个二维低通滤波器,并且滤波器的积分为单位。
这里的“单位积分”是什么意思?另外,如果我选择高斯滤波器,应该使用什么sigma值?
这里的“单位积分”是什么意思?另外,如果我选择高斯滤波器,应该使用什么sigma值?
单位积分意味着掩模或核的总面积应为1。例如,3 x 3平均滤波器意味着您掩模中的每个系数都应为1/9。当您加总掩模中的所有元素时,它们加起来等于1。
Gaussian滤波器本质上具有单位积分/单位面积为1。如果您使用MATLAB,则使用gaussian
标志的fspecial
命令会使其掩模归一化。
但是,如果您想要自己创建高斯掩模,则可以使用以下方程:
请记住,(x,y)
是相对于中心在掩模内部的位置。因此,如果您有一个5 x 5的掩模,则在row = 2, col = 2
处,x = 0
且y = 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中设置高斯滤波器的大小?
创建掩模后,使用任何卷积方法对图像进行高斯滤波。#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;
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
。再次强调的原因是,在对核进行归一化时,这个常数因子会被抵消掉,因此在计算掩模系数时没有必要增加额外的开销。