2016-03-01 902 views
1

我給出了灰度圖像,我想從中創建梯度幅度圖像。 我知道有一個叫imgradient功能,但我不知道該怎樣修改幅度的想法,以便它的計算方式如下:如何在MATLAB中創建梯度幅度圖像

∇f ≈ abs(z7+ 2z8+ z9- z1- 2z2- z3) + abs(z3+ 2z6+ z9- z1- 2z4- z7) 
+0

我不明白你發佈的公式。另外爲什麼你需要「修改」imgradient所返回的數量? – Suever

+0

我知道他們已經實現了幾種方法,我只想知道如何實現自定義方法 –

回答

0

你必須實現自己的梯度功能,並將其應用到圖像I中的每個像素:

//example of a 4x5 image I 
I = [1 3 2 6 5; 6 1 0 18 21; 13 12 13 14 11; 16 15 28 9 20] 

G = I; //set your gradient matrix to be equal to I so that the sides have a value 

//get the height and width of image I 
[h, w] = size(I); 

//loop through each pixel that is not on the side 
for x=2:w-1 
    for y=2:h-1 
     //for each pixel: 
     z1 = I(y-1, x-1); //e.g z1 is the pixel on the upper left 
     z2 = I(y, x-1); 
     z3 = I(y+1, x-1); 
     z4 = I(y-1, x); 
     z6 = I(y+1, x); 
     z7 = I(y-1, x+1); 
     z8 = I(y, x+1); 
     z9 = I(y+1, x+1); 
     G(y,x) = abs(z7+ 2*z8+ z9- z1- 2*z2- z3) + abs(z3+ 2*z6+ z9- z1- 2*z4- z7); 
    end  
end 
+0

它幾乎可以完美地工作。我必須啓動一個雙矩陣來存儲值。 wtf –

0

我得到你想要使用sobel mask(按照你的等式)進行空間濾波。所以,我建議你使用下面的命令:BW = edge(I,'Sobel');

,或者如果你想精確的輸出按你所給出那就試試這個公式:

I = imread('cameraman.tif'); 
I = padarray(I,[1 1],'symmetric'); 
sobel_mask_x = [-1 -2 -1; 0 0 0; 1 2 1]; 
sobel_x = filter2(sobel_mask_x ,I); 
sobel_mask_y = sobel_mask_x'; 
sobel_y = filter2(sobel_mask_y ,I); 
sobel_responce = abs(sobel_x)+abs(sobel_y); 
figure,imshow(sobel_responce,[]); title('Sobel gradient'); 

這是更快,而不是使用循環。

+0

L1梯度大小,你不經常看到:) – mainactual