对于定向梯度的直方图,如何计算边缘像素的梯度向量



要计算图像的定向梯度直方图,我们需要计算每个像素的梯度向量。但是边缘上的像素对于梯度向量缺少一些邻域。如何处理?

例如,图像左边缘的像素左侧没有邻居。那么如何计算它在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

最新更新