假设对于每个像素,梯度∇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乘以运算符,然后对它们进行卷积?
答案 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中使用imgradient和imgradientxy函数。如果你想要方向渐变,使用imgradientxy,如果你想要渐变幅度和方向组件,请使用imgradient。
您可以选择使用Sobel,Prewitt或Roberts渐变内核或使用中心或中间差异计算衍生物。
以下是一个例子:
[Gx,Gy] = imgradientxy(im,'Sobel');
相反,如果你想继续使用conv2,你可以使用fspecial函数获得渐变内核。
kernelx = fspecial('sobel');
kernely = kernelx';