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

时间:2010-03-30 13:01:56

标签: image-processing filtering

这是LoG过滤的公式: alt text http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnlog2.gif

同样在使用LoG过滤的应用程序中,我看到只使用一个参数调用该函数: 西格马(σ)。 我想尝试使用该公式进行LoG过滤(之前的尝试是通过高斯滤波器,然后是laplacian滤波器,带有一些滤波器窗口大小) 但是看看那个公式我无法理解滤波器的大小如何与这个公式相关联,这是否意味着滤波器的大小是固定的? 你能解释一下如何使用它吗?

4 个答案:

答案 0 :(得分:7)

正如您现在可能从其他答案和链接中了解到的那样,LoG过滤器会检测图像中的边缘和线条。仍然缺少的是对σ的解释。

σ是过滤器的比例。一个像素宽的线是线还是噪声?一条线是6像素宽一条线还是一条有两条不同平行边的物体?渐变是从黑色变为白色,跨越6或8像素的边缘还是仅仅是渐变?这是你必须要决定的东西,σ的值反映了你的决定 - σ越大,线条越宽,边缘越平滑,忽略更多的噪音。

不要混淆滤波器的比例(σ)和离散近似的大小(通常称为模板)。在Paul的linkσ= 1.4且模板尺寸为9.虽然使用4σ到6σ的模板尺寸通常是合理的,但这两个量是相当独立的。较大的模板可以提供更好的滤波器近似值,但在大多数情况下,您不需要非常好的近似值。

答案 1 :(得分:5)

这也让我感到困惑,直到我不得不为你做一个单项目的事情,我明白你应该怎么做公式!

您可以使用此公式生成离散LoG过滤器。如果您编写一些代码来实现该公式,则可以生成用于图像卷积的过滤器。要生成一个5x5模板,只需调用x和y的代码,范围从-2到+2。

这将生成要在LoG模板中使用的值。如果你绘制这个产生的值,你应该看到这个过滤器典型的“墨西哥帽”形状,如下所示:

LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif

您可以通过更改模板的宽度(大小)和西格玛值(峰值的宽度)来微调模板。模板越宽越宽,受噪声影响越小,结果将是因为它将在更广泛的区域内运行。

获得过滤器后,可以通过将模板与图像进行卷积将其应用于图像。如果您之前没有这样做,请查看这几个教程。 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;
        }
    }
}

答案 2 :(得分:2)

仅出于可视化目的,这是一个简单的高斯拉普拉斯(墨西哥帽)小波的Matlab 3D彩色图。您可以更改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参数的效果,执行以下操作:

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')

我发现这在计算机视觉中用于边缘检测时非常有用。虽然不是确切的答案,但希望这会有所帮助。

答案 3 :(得分:1)

它似乎是一个连续的圆形滤波器,其半径为sqrt(2)* sigma。如果你想为图像处理实现它,你需要近似它。

这里有sigma = 1.4的示例:http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm