gpt4 book ai didi

image - 具有单位积分的低通滤波器

转载 作者:行者123 更新时间:2023-12-01 09:21:52 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

Gaussian 2D Equation

请记住,(x,y) 是掩码内相对于中心 的位置。因此,如果您有一个 5 x 5 的掩码,则在 row = 2, col = 2x = 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 规则的更多信息,请查看我的帖子关于这里的主题:By which measures should I set the size of my Gaussian filter in MATLAB?

创建该掩码后,使用您希望的任何卷积方法对图像进行高斯滤波。

如果您会使用 MATLAB,这里有另一篇文章可能会对您有所帮助。

How to make a Gaussian filter in 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。同样,原因是当您对内核进行归一化时,这个常数因子无论如何都会被抵消,因此在计算掩码系数时不需要添加任何额外的开销。

关于image - 具有单位积分的低通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22885476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com