拉普拉斯高斯滤波器的使用

15

这是一个LoG过滤的公式: alt text
(来源:ed.ac.uk)

在使用LoG过滤的应用程序中,我看到该函数仅使用一个参数调用: sigma(σ)。 我想尝试使用该公式进行LoG过滤(之前的尝试是通过高斯滤波和带有一些滤波窗口大小的拉普拉斯滤波进行的), 但是从该公式中我无法理解滤波器的大小如何与此公式相关联,这是否意味着滤波器大小是固定的? 您能否解释如何使用它?

4个回答

8
正如您从其他答案和链接中可能已经了解到的那样,LoG滤波器可以检测图像中的边缘和线条。现在仍然缺少的是对 σ 的解释。
σ 是滤波器的比例尺度。一个宽度为一个像素的线条是线条还是噪声?一条宽6个像素的线是线还是具有两个明显平行边缘的物体?梯度在跨越6或8个像素时从黑色变为白色是边缘还是只是梯度?这是你需要决定的事情,σ 的值反映了你的决定——σ 越大,线条越宽,边缘越平滑,忽略的噪声就越多。
不要混淆滤波器的比例尺度(σ)和离散近似的大小(通常称为模板)。在 Paul 的 link 中,σ=1.4,模板大小为9。虽然通常使用4σ到6σ的模板大小是合理的,但这两个量是相互独立的。更大的模板提供了更好的滤波器逼近,但在大多数情况下,你不需要非常好的逼近。

σ的值是不变的还是我们需要自己确定? - Usman YousafZai

5
这也曾经让我感到困惑,直到我为大学项目做同样的事情才明白你应该如何使用公式!您可以使用此公式生成离散的LoG滤波器。如果您编写一些代码来实现该公式,则可以生成用于图像卷积的滤波器。要生成例如5x5的模板,请使用范围从-2到+2的x和y调用代码即可。这将生成用于LoG模板的值。如果您绘制此操作产生的值,您应该会看到此滤波器的典型“墨西哥帽”形状,如下所示:LoG template
(来源: ed.ac.uk) 你可以通过改变模板的宽度(大小)和sigma值(峰值的宽度)来微调模板。模板越宽和越宽,受噪声的影响就越小,因为它将在更广泛的区域内运行。
一旦你有了过滤器,就可以通过将模板与图像卷积来应用它。如果你以前没有做过这个,请查看这些教程。java applet tutorials more mathsy
基本上,在每个像素位置,你“放置”你的卷积模板,以该像素为中心。然后,你将周围的像素值乘以模板中相应的“像素”,并将结果相加。这就是该位置的新像素值(通常还必须对输出进行归一化(缩放),以将其带回正确的值范围内)。
下面的代码大致说明了你可能如何实现这一点。请原谅任何错误/打字等,因为它尚未经过测试。
希望这能帮到你。
private float LoG(float x, float y, float sigma)
{
    // implement formula here
    return (1 / (Math.PI * sigma*sigma*sigma*sigma)) * //etc etc - also, can't remember the code for "to the power of" off hand
}

private void GenerateTemplate(int templateSize, float sigma)
{
    // Make sure it's an odd number for convenience
    if(templateSize % 2 == 1)
    {
        // Create the data array
        float[][] template = new float[templateSize][templatesize];

        // Work out the "min and max" values. Log is centered around 0, 0
        // so, for a size 5 template (say) we want to get the values from
        // -2 to +2, ie: -2, -1, 0, +1, +2 and feed those into the formula.
        int min = Math.Ceil(-templateSize / 2) - 1;
        int max = Math.Floor(templateSize / 2) + 1;

        // We also need a count to index into the data array...
        int xCount = 0;
        int yCount = 0;

        for(int x = min; x <= max; ++x)
        {
            for(int y = min; y <= max; ++y)
            {
                // Get the LoG value for this (x,y) pair
                template[xCount][yCount] = LoG(x, y, sigma);
                ++yCount;
            }
            ++xCount;
        }
    }
}

正如保罗在之前的回答中所说,它似乎是一个半径为sqrt(2) * sigma的滤波器。 如果是这样,那么滤波器大小仅取决于sigma值, 那么只需要sigma值。 然而我不确定,可能使用独立参数如sigma和模板大小也可以。 - maximus

2

为了展示,这里有一个简单的Matlab三维彩色图,展示了拉普拉斯高斯(墨西哥帽)小波的形状。您可以更改sigma(σ)参数并观察其对图形形状的影响:

sigmaSq = 0.5 % Square of σ parameter
[x y] = meshgrid(linspace(-3,3), linspace(-3,3)); 
z = (-1/(pi*(sigmaSq^2))) .* (1-((x.^2+y.^2)/(2*sigmaSq))) .*exp(-(x.^2+y.^2)/(2*sigmaSq)); 
surf(x,y,z)

您可以通过以下方式比较sigma参数对Mexican Hat的影响:
您也可以比较sigma参数对Mexican Hat的影响,方法如下:
t = -5:0.01:5;
sigma = 0.5;

mexhat05 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 1;
mexhat1 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 2;
mexhat2 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

plot(t, mexhat05, 'r', ...
     t, mexhat1, 'b', ...
     t, mexhat2, 'g');

或者,您可以简单地使用Matlab提供的Wavelet工具箱,方法如下:
lb = -5; ub = 5; n = 1000; 
[psi,x] = mexihat(lb,ub,n); 
plot(x,psi), title('Mexican hat wavelet')

我在计算机视觉的边缘检测实现中发现这个很有用。虽然不是完全正确的答案,但希望这可以帮到你。


1

我用高斯差分法进行了近似,但我不想使用那种近似方法。你在谈论什么样的近似方法? - maximus
@maximums:你有没有仔细阅读我提供的链接页面?这是一个连续函数,所以在离散图像处理中需要进行逼近。链接页面上有一个关于 sigma = 1.4 的系数示例集,并且有足够的信息让你生成任何你需要的 sigma 值的系数。 - Paul R

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