【问题标题】:Laplacian of gaussian filter use高斯滤波器使用拉普拉斯算子
【发布时间】:2011-02-02 11:19:15
【问题描述】:

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

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

【问题讨论】:

    标签: image-processing filtering gaussian laplacian laplacianofgaussian


    【解决方案1】:

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

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

    【讨论】:

    • 我做了高斯差的近似值,但我不想使用那个近似值。你在说什么样的近似值?
    • @maximums:您阅读我链接到的页面了吗?它是连续函数,因此您必须对其进行近似以进行离散图像处理。在我链接到的页面上有一组 sigma = 1.4 的示例系数,以及足够的信息让您生成所需的任何 sigma 值的系数。
    【解决方案2】:

    这也让我感到困惑,直到我不得不为一个 uni 项目做和你一样的事情,我才明白你应该用公式做什么!

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

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


    (来源:ed.ac.uk)

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

    获得滤镜后,您可以通过将模板与图像进行卷积来将其应用于图像。如果您以前没有这样做过,请查看这几个教程。 java applet tutorialsmore 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 和模板大小。
    【解决方案3】:

    您现在可能已经从其他答案和链接中发现,LoG 过滤器检测图像中的边缘和线条。仍然缺少的是对 σ 是什么的解释。

    σ 是过滤器的 scale。一个像素宽的线是线还是噪声?一条 6 像素宽的线是一条线还是具有两条不同平行边缘的对象?在 6 或 8 个像素上从黑色变为白色的渐变是边缘还是只是渐变?这是您必须决定的事情,而 σ 的值反映了您的决定 - σ 越大,线条越宽,边缘越平滑,并且可以忽略更多噪声。

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

    【讨论】:

    • sigma(σ)的值是常数还是要自己取?
    【解决方案4】:

    仅出于可视化目的,这是一个简单的 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')
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多