要计算图像的定向梯度直方图,我们需要为每个像素计算梯度向量。但是边缘上的像素缺少渐变矢量的一些邻居。如何处理?
例如,图像左边缘的像素左侧没有邻居。那么如何计算x方向的梯度?
答案 0 :(得分:1)
请参阅数值梯度的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)
。
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