这是我用于计算图像导数的函数。因为我是这个领域的新手,请帮助我理解这段代码。如果有人能给我一些理解这个概念的链接,我会很高兴。我有些怀疑 -
为什么我们在这里使用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');
答案 0 :(得分:0)
此代码计算图像的各种方向导数 - x / y是第一方向导数,xx / yy / xy是二阶导数。用于推导的数字滤波器是标准变化西格玛的2D高斯,由适当的偏导数导出(例如,在' xx'中,高斯由x导出两次)。从你的问题来看,我不确定你是否熟悉偏导数的概念,你可以谷歌它。 ndgrid用于创建网格矩阵 - 这是Matlab中一种非常常用的方法。也许你知道函数meshgrid,它是一样的,只有ndgrid也可以创建更高维度的网格矩阵。
imfilter用于在数字滤波器与图像之间执行卷积(相关性更精确)。其结果是估计所需的导数。