梯度和导数

时间:2015-06-03 19:19:16

标签: matlab gaussian

我试图找到图像的高斯的一阶导数(使用Matlab),我尝试了两种方法。使用渐变和计算导数但结果看起来彼此不同。

  Method 1
  k=7,s=3% kernel,st.dev
  f = fspecial('gaussian', [k k], s)
  [Gx,Gy] = gradient(f)

  Method 2
  k=7,s=3% kernel,st.dev
  [x,y] = meshgrid(-floor(k/2):floor(k/2), -floor(k/2):floor(k/2))
  G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*(s^2))
  Gn=G/sum(G(:))
  Gx = -x.*Gn/(s^2)
  Gy = -y.*Gn/(s^2)

两种方法的Gx和Gy应该相同,但值存在差异。有谁知道那是为什么?我期待他们会是一样的。有没有一种计算衍生物的首选方法? 谢谢。

修改:根据康拉德的建议改变了G定义,但问题仍然存在。

2 个答案:

答案 0 :(得分:0)

这看起来不对:

 G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*s);

假设这应该是(X,Y)的正常密度,其中X和Y是独立的零均值RV,SDs = s,这应该是:

G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*(s^2));

(每个组件中指数前面的术语是1/(sqrt(2*pi)*s),你有两次给1/(2*pi*s^2)

答案 1 :(得分:0)

根据fspecial的文档:http://www.mathworks.com/help/images/ref/fspecial.html

enter image description here

因此您似乎应该将G改为:

G = exp(-(x.^2+y.^2)/(2*s^2));