要計算圖像的方向梯度直方圖,我們需要計算每個像素的梯度矢量。但邊緣上的像素缺少漸變矢量的一些鄰居。如何處理?對於定向梯度的直方圖,如何計算邊緣像素的梯度向量?
例如,圖像左邊緣的像素左側沒有鄰居。那麼如何計算它在x方向上的梯度?
要計算圖像的方向梯度直方圖,我們需要計算每個像素的梯度矢量。但邊緣上的像素缺少漸變矢量的一些鄰居。如何處理?對於定向梯度的直方圖,如何計算邊緣像素的梯度向量?
例如,圖像左邊緣的像素左側沒有鄰居。那麼如何計算它在x方向上的梯度?
參考數值梯度的MATLAB文檔:http://www.mathworks.com/help/matlab/ref/gradient.html
梯度計算用於內部數據點的中心差。例如,考慮具有單位間隔數據的矩陣A,其具有水平梯度G =梯度(A)。內部梯度值G(:,j)爲:
G(:,j) = 0.5*(A(:,j+1) - A(:,j-1));
其中j在2和N-1之間變化,其中N是大小(A,2)。沿矩陣的邊緣梯度值與單面差來計算,使得
G(:,1) = A(:,2) - A(:,1);
G(:,N) = A(:,N) - A(:,N-1);
如果指定的點間隔,則差異適當地縮放。如果指定了兩個或更多個輸出,則漸變也以類似的方式計算沿着其他維度的差異。與diff函數不同,gradient會返回一個數組,其元素個數與輸入相同。
A = magic(5)
結果:
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
[Gx, Gy] = gradient(A)
結果:
Gx =
7.0000 -8.0000 -8.0000 7.0000 7.0000
-18.0000 -8.0000 4.5000 4.5000 2.0000
2.0000 4.5000 7.0000 4.5000 2.0000
2.0000 4.5000 4.5000 -8.0000 -18.0000
7.0000 7.0000 -8.0000 -8.0000 7.0000
Gy =
6.0000 -19.0000 6.0000 6.0000 1.0000
-6.5000 -9.0000 6.0000 6.0000 3.5000
-6.5000 3.5000 6.0000 3.5000 -6.5000
3.5000 6.0000 6.0000 -9.0000 -6.5000
1.0000 6.0000 6.0000 -19.0000 6.0000
的Gx的最左邊的列:
A(:, 2) - A(:, 1)
結果:
7
-18
2
2
7
正如你所看到的,Gx(:, 1)
等於A(:, 2) - A(:, 1)
。
相同的結果:
A(2, :) - A(1, :)
結果:
6 -19 6 6 1
填充邊緣通過複製:
對於濾波器梯度濾波器(大小[3,1]和[1,3])填充只是在每一側複製行和列:
17 17 24 1 8 15 15
17 17 24 1 8 15 15
23 23 5 7 14 16 16
4 4 6 13 20 22 22
10 10 12 19 21 3 3
11 11 18 25 2 9 9
11 11 18 25 2 9 9
示例o ˚F式圖像邊界內:
的Gx(:,2)= 0.5 *(A(:,3) - A(:,1))
實施例:
0.5*(A(:, 3) - A(:, 1))
結果:
-8.0000
-8.0000
4.5000
4.5000
7.0000