2014-02-12 56 views
0

假設對於每個像素,梯度∇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的運營商,然後他們卷積?

回答

1

爲了優化計算的目的,它可以幫助申請的1/2比例直接向濾波器內核

filt1 = filt1/2; 

否則,如果完成之後,N^2個附加乘法有工作要做,以N×N的圖像的像素,instea d只有9個乘法到3x3內核。

除此之外,我同意麥克馬。你的計算看起來不像一個區別。事實上,你已經在第一行申請了gradient(),所以我不明白你需要什麼。

+0

好吧,讓我們說,我用Sobel有梯度,你的意思是他們是第一個導數? – user3269865

+0

'漸變(im)'已經給出了'im'的第一個衍生物 –

2

因爲相關性(標量)是卷積的質量,所以乘法的順序不應該起任何作用。

另一方面,你的過濾器在我看來不像他們執行差異化。對於離散分化的經典過濾器將是一個Sobel看起來是這樣的:

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

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

我應該由這個操作員來做。那麼常數(1/2)呢? – user3269865

+0

正如@MattJ所說,通過將它應用到過濾器上,你可以避免很多操作,但數學上它是一樣的。 – McMa

0

我傾向於使用MATLAB中的imgradientimgradientxy函數。如果您需要方向漸變,請使用imgradientxy,如果您需要梯度大小和方向分量,請使用imgradient。

您可以選擇使用Sobel,Prewitt或Roberts梯度內核或使用中心或中間差異來計算導數。

下面是一個例子:

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

相反,如果你想繼續使用CONV2,你可以使用fspecial功能梯度內核。

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