代码之家  ›  专栏  ›  技术社区  ›  KansaiRobot

高斯滤波器实现

  •  1
  • KansaiRobot  · 技术社区  · 9 年前

    我准备在C#中实现高斯滤波器,在准备过程中,我正在阅读有关这方面的文献。然而,我有不同的消息来源。

    有一本书(日本文本:内村实用图像处理简介)规定计算模板的等式为

    w(u,v)= (1/2*pi*sigma^2) exp(-(x^2+v^2)/(2*sigma^2)). 
    

    SIZE = 3*sigma .

    w(u,v)= (1/SUM)* exp(-(x^2+v^2)/(2*sigma^2)) 
    

    哪里 SUM 是所有指数值的总和。下面是他们提供的伪代码-我认为它接近MATLAB。

    function template=gaussian_template(winsize,sigma)
    %Template for Gaussian averaging
    %Usage:[template]=gaussian_template(number, number)
    %Parameters: winsize-size of template (odd, integer)
    % sigma-variance of Gaussian function
    %Author: Mark S. Nixon
    %centre is half of window size
    centre=floor(winsize/2)+1;
    %we'll normalise by the total sum
    sum=0;
    
    %so work out the coefficients and the running total
    for i=1:winsize
        for j=1:winsize
            template(j,i)=exp(-(((j-centre)*(j-centre))+((i-centre)*(i-centre)))/(2*sigma*sigma))
            sum=sum+template(j,i);
        end
    end
    %and then normalise
    template=template/sum; 
    

    我的问题是,你们中有人使用过高斯滤波实现吗?这个等式正确吗?你知道为什么这本书给出了一个更简单的实现吗?

    1 回复  |  直到 9 年前
        1
  •  3
  •   jaket    9 年前

    两种实现都在归一化,因此系数之和为1.0。第二种实现手动计算总和以获得准确的数字,这可能是最好的方法。另一个实现为 过滤器的版本。然而,离散滤波器仅给出近似值,因此近似和与连续积分不同。

    旁注:您可能需要记住高斯在单个像素上是非线性的。在像素中心采样将产生不准确的结果。最好在亚像素处采样,然后对整个像素进行平均。