【问题标题】:Derivative of Gaussian filter in MatlabMatlab中高斯滤波器的导数
【发布时间】:2014-07-21 17:13:36
【问题描述】:

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

【问题讨论】:

  • 这是一个collection of filters,包括高斯、高斯导数和高斯拉普拉斯算子。他们提供了 MATLAB 源代码来重现滤波器组。

标签: matlab filter


【解决方案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

如果你递归地重新应用这个,你可以去任何你喜欢的顺序。

【讨论】:

  • [1 -1] 或 [-1 1] 是您想要的像素前面或后面半个像素的数值导数。 [1 0 -1] 是两者的对称版本,所以我认为它是正确的。感谢您的定向快捷方式。不知道。
【解决方案2】:

只使用高斯的导数,这并不比计算高斯本身更难。

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)

【讨论】:

  • 很抱歉问了这么老的问题,但由于导数的链式法则,导数实际上不是 (-x/s^2)G(x,y) 吗?
  • 谢谢@TiagoFassoni。我一定是在睡觉。
【解决方案3】:
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

【讨论】:

  • 欢迎来到 Stack Overflow!一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决了问题,那么答案会更有帮助。
猜你喜欢
  • 2011-02-15
  • 2023-04-09
  • 1970-01-01
  • 2013-03-29
  • 2017-04-20
  • 2012-10-22
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多