【发布时间】:2014-07-21 17:13:36
【问题描述】:
Matlab中有高斯滤波函数的导数吗?将高斯滤波器与[1 0 -1]进行卷积以获得结果是否合适?
【问题讨论】:
-
这是一个collection of filters,包括高斯、高斯导数和高斯拉普拉斯算子。他们提供了 MATLAB 源代码来重现滤波器组。
Matlab中有高斯滤波函数的导数吗?将高斯滤波器与[1 0 -1]进行卷积以获得结果是否合适?
【问题讨论】:
据我所知,没有内置的高斯滤波器导数。您可以很容易地为自己创建一个,如下所示:
对于二维
G1=fspecial('gauss',[round(k*sigma), round(k*sigma)], sigma);
[Gx,Gy] = gradient(G1);
[Gxx,Gxy] = gradient(Gx);
[Gyx,Gyy] = gradient(Gy);
其中 k 确定它的大小(取决于您想要支持的程度)。
对于 1D 也是一样,但你没有两个渐变方向,只有一个。你也可以用另一种方式创建高斯滤波器,我假设你已经有了你喜欢的方法。
在这里我给了你第二个订单,但你可以在这里查看模式以继续下一个订单。
您发布的卷积滤波器 ( [1 0 -1] ) 看起来像有限差分。尽管我认为您的方法在概念上是正确的,但最正确和最常见的方法是使用 [1 -1] 或 [-1 1],中间的 0 在近似导数时跳过中心样本。这可能也有效(但请记住,这是一个近似值,高阶与 true 结果不同),但我通常更喜欢我在上面发布的方法。
注意:如果您确实对 2D 过滤器感兴趣,高斯导数族具有可引导性,这意味着您可以轻松地为高斯导数创建一个过滤器,从我放弃了你。假设你想要的方向定义为
cos(theta), sin(theta)
那么高斯在那个方向的导数就是
Gtheta = cos(theta)*Gx + sin(theta)*Gy
如果你递归地重新应用这个,你可以去任何你喜欢的顺序。
【讨论】:
只使用高斯的导数,这并不比计算高斯本身更难。
G(x,y) = exp(-(x^2+y^2)/(2*s^2))
d/dx G(x, y) = -x/s^2 G(x,y)
d/dy G(x, y) = -y/s^2 G(x,y)
【讨论】:
function [ y ] = dgaus( x,n )
%DGAUS nth derivative of exp(-x.^2)
odd=0*x;
even=exp(-x.^2);
for order=0:(floor(n/2)-1)
odd=-4*order*odd-2*x.*even;
even=-(4*order+2)*even-2*x.*odd;
end
if mod(n,2)==0
y=even;
else
y=-2*(n-1)*odd-2*x.*even;
end
end
【讨论】: