C# 高斯滤波器实现

C# 高斯滤波器实现,c#,matlab,gaussian,gaussianblur,C#,Matlab,Gaussian,Gaussianblur,我准备在C#中实现一个高斯滤波器,我正在阅读有关这方面的文献。然而,我有不同的消息来源 有一本书(日本文本:内村的实用图像处理简介)规定计算模板的方程式为 w(u,v)= (1/2*pi*sigma^2) exp(-(x^2+v^2)/(2*sigma^2)). 我认为这是正确的,尽管作者将大小和sigma链接为size=3*sigma 最后,一本优秀的书(Nixon和Aguado的《计算机视觉的特征提取与图像处理》,第106页)给出了正确的公式,但在代码中实现时给出了不同的实现 w(u,v

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

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

w(u,v)= (1/2*pi*sigma^2) exp(-(x^2+v^2)/(2*sigma^2)). 
我认为这是正确的,尽管作者将大小和sigma链接为
size=3*sigma

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

w(u,v)= (1/SUM)* exp(-(x^2+v^2)/(2*sigma^2)) 
其中,
SUM
是所有指数值的总和。下面是他们提供的伪代码-我认为它接近MATLAB

函数模板=高斯模板(winsize,sigma)
%高斯平均模板
%用法:[模板]=高斯模板(数字,数字)
%参数:winsize模板的大小(奇数、整数)
%高斯函数的sigma方差
%作者:马克·S·尼克松
%中心是窗户大小的一半
中心=楼层(winsize/2)+1;
%我们将通过总和进行归一化
总和=0;
%因此,计算出系数和运行总数
对于i=1:winsize
对于j=1:winsize
模板(j,i)=exp(-((j-中心)*(j-中心))+((i-中心)*(i-中心))/(2*sigma*sigma))
总和=总和+模板(j,i);
结束
结束
%然后再正常化
模板=模板/总和;
虽然正确的公式和代码实现在某种程度上给出了类似的结果,但我想知道为什么在同一本书中,实现和公式是不同的


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

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


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

我已经了解到高斯是可分离的,一个实现(杂志一个)实际上是这样计算的(一个用于行,一个用于列),而不是上面的一个。这似乎是“有效地计算”,但我不明白为什么这是有效的。有什么想法吗?假设你有一个9x9过滤内核。使用9x9内核在映像上执行单次传递比1x9加9x1的传递需要更多的操作。对于本例,分离内核的速度是(9^2)/(9+9)=4.5倍。谢谢。我还有一个关于高斯实现的问题。如果你看一看,我会很感激的