首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于有向梯度的直方图,如何计算边缘像素的梯度向量?

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

Stack Overflow用户
提问于 2016-07-24 21:47:40
回答 1查看 199关注 0票数 0

为了计算图像的方向梯度直方图,我们需要计算每个像素的梯度向量。但是,边缘上的像素缺少一些邻域来表示梯度向量。该如何应对呢?

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

EN

回答 1

Stack Overflow用户

发布于 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返回的数组的元素数与输入的元素数相同。

代码语言:javascript
复制
A = magic(5)

结果:

代码语言:javascript
复制
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 =

代码语言:javascript
复制
    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 =

代码语言:javascript
复制
    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的最左列:

代码语言:javascript
复制
A(:, 2) - A(:, 1)

结果:

代码语言:javascript
复制
    7
  -18
    2
    2
    7

如您所见,Gx(:, 1)等于A(:, 2) - A(:, 1)

对于Gy也有同样的结果:

代码语言:javascript
复制
A(2, :) - A(1, :)

结果:

代码语言:javascript
复制
6  -19    6    6    1

通过复制填充边:

对于滤镜梯度滤镜(大小为3,1和1,3),填充只是在每一侧复制行和列:

代码语言:javascript
复制
   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))

示例:

代码语言:javascript
复制
0.5*(A(:, 3) - A(:, 1))

结果:

代码语言:javascript
复制
  -8.0000
  -8.0000
   4.5000
   4.5000
   7.0000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38552714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档