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

时间:2016-07-24 13:47:40

标签: matlab opencv image-processing computer-vision gradient

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

例如,图像左边缘的像素左侧没有邻居。那么如何计算x方向的梯度?

1 个答案:

答案 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