Matlab中是否存在高斯滤波函数的导数?将高斯滤波器与[1 0 -1]进行卷积以获得结果是否合适?
答案 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