为了计算图像的方向梯度直方图,我们需要计算每个像素的梯度向量。但是,边缘上的像素缺少一些邻域来表示梯度向量。该如何应对呢?
例如,图像左边缘的像素在其左侧没有邻居。那么如何计算它在x方向的梯度呢?
发布于 2016-07-24 22:31:45
参考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.0000Gy =
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.0000Gx的最左列:
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.0000https://stackoverflow.com/questions/38552714
复制相似问题