由核心的图像梯度导出的一阶导数

时间:2014-02-12 13:18:23

标签: matlab gradient convolution

假设对于每个像素,梯度∇g= [∂f/∂x,∂f/∂y]。那么一阶导数应该由两个算子测量,如1/2 [1,0,1; 0,0,0; ​​-1,0,-1]& 1/2 [1,0,1; 0,0,0; ​​-1,0,-1] 然后:

[i,j]=gradient(im);
filt1=[1,0,1;0,0,0;-1,0,-1];
filt2=[-1,0,1;0,0,0;-1,0,-1];
ii=(1./2).*(conv2(filt1,i));
jj=(1./2).*(conv2(filt2,j));

G_x=conv2(ii,im);
G_y=conv2(jj,im);

它是正确的还是我应该首先将1/2乘以运算符,然后对它们进行卷积?

3 个答案:

答案 0 :(得分:2)

因为关联性(使用标量)是卷积的质量,所以乘法的顺序不应该起任何作用。

另一方面,你的过滤器在我看来并不像他们表现出差异化。离散微分的经典滤波器是Sobel,看起来像这样:

[1,0,-1
 2,0,-2
 1,0,-1]

[1,2,1
 0,0,0
-1,-2,-1]

答案 1 :(得分:1)

为了优化计算,有助于将1/2的缩放直接应用于滤波器内核

filt1 = filt1/2;

否则,如果之后完成,则必须对NxN图像像素进行N ^ 2次附加乘法,而不是仅对9x3内核进行9次乘法。

除此之外,我同意麦克马。你的计算看起来不像差异化。事实上,你已经在第一行应用了gradient(),所以我不明白你还需要什么。

答案 2 :(得分:0)

我倾向于在MATLAB中使用imgradientimgradientxy函数。如果你想要方向渐变,使用imgradientxy,如果你想要渐变幅度和方向组件,请使用imgradient。

您可以选择使用Sobel,Prewitt或Roberts渐变内核或使用中心或中间差异计算衍生物。

以下是一个例子:

[Gx,Gy] = imgradientxy(im,'Sobel');

相反,如果你想继续使用conv2,你可以使用fspecial函数获得渐变内核。

kernelx = fspecial('sobel');
kernely = kernelx';