使用高斯分布的图像导数

时间:2014-04-23 08:52:37

标签: image-processing signal-processing

这是我用于计算图像导数的函数。因为我是这个领域的新手,请帮助我理解这段代码。如果有人能给我一些理解这个概念的链接,我会很高兴。我有些怀疑 -

为什么我们在这里使用ndgrid? 这里有什么方向'x','y','xx',('xy','yx'),'yy'? 为什么这个高斯的公式如何以及为什么根据方向改变? 为什么我们最终会使用imfilter?

function D =calc_image_derivatives(I,sigma,direction)    
[x,y]=ndgrid(floor(-3*sigma):ceil(3*sigma),floor(-3*sigma):ceil(3*sigma));
switch(direction)
case 'x'
  DGauss=-(x./(2*pi*sigma^4)).*exp(-(x.^2+y.^2)/(2*sigma^2));
 case 'y'
  DGauss=-(y./(2*pi*sigma^4)).*exp(-(x.^2+y.^2)/(2*sigma^2));
 case 'xx'
  DGauss = 1/(2*pi*sigma^4) * (x.^2/sigma^2 - 1) .* exp(-(x.^2 + y.^2)/(2*sigma^2));
 case {'xy','yx'}
  DGauss = 1/(2*pi*sigma^6) * (x .* y)           .* exp(-(x.^2 + y.^2)/(2*sigma^2));
 case 'yy'
  DGauss = 1/(2*pi*sigma^4) * (y.^2/sigma^2 - 1) .* exp(-(x.^2 + y.^2)/(2*sigma^2));
 end
 D = imfilter(I,DGauss,'conv','replicate');

1 个答案:

答案 0 :(得分:0)

此代码计算图像的各种方向导数 - x / y是第一方向导数,xx / yy / xy是二阶导数。用于推导的数字滤波器是标准变化西格玛的2D高斯,由适当的偏导数导出(例如,在' xx'中,高斯由x导出两次)。从你的问题来看,我不确定你是否熟悉偏导数的概念,你可以谷歌它。 ndgrid用于创建网格矩阵 - 这是Matlab中一种非常常用的方法。也许你知道函数meshgrid,它是一样的,只有ndgrid也可以创建更高维度的网格矩阵。

imfilter用于在数字滤波器与图像之间执行卷积(相关性更精确)。其结果是估计所需的导数。