我试图找到图像的高斯的一阶导数(使用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定义,但问题仍然存在。
答案 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
因此您似乎应该将G
改为:
G = exp(-(x.^2+y.^2)/(2*s^2));