要计算图像的定向梯度直方图,我们需要计算每个像素的梯度向量。但是边缘上的像素对于梯度向量缺少一些邻域。如何处理?
例如,图像左边缘的像素左侧没有邻居。那么如何计算它在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);
如果指定了点间距,则会适当缩放差异。如果指定了两个或多个输出,gradient也会以类似的方式计算沿其他维度的差异。与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)
。
Gy:的结果相同
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
图像边界内的公式示例:
Gx(:,2)=0.5*(A(:,3)-A(:,1))
示例:
0.5*(A(:, 3) - A(:, 1))
结果:
-8.0000
-8.0000
4.5000
4.5000
7.0000