Matlab中高斯滤波的导数

时间:2014-06-01 12:52:33

标签: matlab filter

Matlab中是否存在高斯滤波函数的导数?将高斯滤波器与[1 0 -1]进行卷积以获得结果是否合适?

3 个答案:

答案 0 :(得分:12)

据我所知,没有内置的高斯滤波器导数。你可以很容易地为自己创建一个如下:

对于2D

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

如果你以递归的方式重新申请,你可以去任何你喜欢的订单。

答案 1 :(得分:1)

只使用高斯的导数,然后计算高斯本身并不困难。

G(x,y) = exp(-(x^2+y^2)/(2*s^2))
d/dx G(x, y) = -x/s^2
d/dy G(x, y) = -y/s^2

答案 2 :(得分:-1)

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