高斯滤波器实现

时间:2017-08-18 05:38:22

标签: c# matlab gaussian gaussianblur

我准备在C#中实现高斯滤波器,并且在准备中我正在阅读有关此的文献。但是我有不同意见。

一本书(日文:Uchimura的实用图像处理介绍)规定了计算模板的公式

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

我认为这是正确的,尽管作者将大小和西格玛链接为SIZE = 3*sigma

最后一本优秀的书(Nixon和Aguado的计算机视觉特征提取与图像处理,第106页)给出了正确的等式,但在代码中实现时给出了不同的实现。

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 个答案:

答案 0 :(得分:3)

两种实现都是规范化的,因此系数之和为1.0。第二个实现手动计算总和以获得确切的数字,这可能是最好的方法。另一个实现为过滤器的连续版本提供了精确的总和。但是,对滤波器进行离散化只会给出近似值,因此近似和与连续积分不同。

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