zoukankan      html  css  js  c++  java
  • 机器视觉 Histogram of oriented gradients

    Histogram of oriented gradients 简称 HoG, 是计算机视觉和图像处理领域一种非常重要的特征,被广泛地应用于物体检测,人脸检测,人脸表情检测等。

    HoG 最早是在2005 年的CVPR 上由 Navneet Dalal 和 Bill Triggs 提出来的。HoG 的算法很简单,对于物体的特征表示却非常有效。简单而高效,这大概也是其从被提出来之后,就被CV界广泛使用的原因所在。

    下面简单介绍一下HoG 的算法:
    首先是计算梯度:
    我们知道图像上一点,在水平方向和垂直方向都存在梯度,假设其水平方向上的梯度为 Gx, 垂直方向上的梯度为 Gy, 我们可以从下面的表达式计算其梯度:

    Gx=f(i,j+1)f(i,j1)

    Gy=f(i+1,j)f(i1,j)

    对于图像来说,我们可以构造两个滤波器 [1,0,1], [1,0,1]T, 让这两个滤波器对图像分别在水平方向和垂直方向做卷积,就可以得到图像水平方向和垂直方向的梯度。

    接下来,要计算该点的orientation,首先计算梯度形成的正切角,

    tanθ=Gy/Gxθ=tan1(Gy/Gx)

    θ 的取值范围可以是 0180 或者 0360, 一般来说取 0180,将这 0180 分成K个区间,那么每个区间的跨度是Δ=180/K, orientation 记录的就是正切角落入第几个区间:

    Ori=θΔ

    一般来说K=9, 那么Δ=20, Ori 的范围就是 0-8, 图像上每一个点都有一个正切角 θ, 并且可以得到每个像素点的orientation, 可以对这些orientation 做统计,就能得到一个histogram, 即直方图。所以称为 Histogram of oriented gradients.

    我们可以看到,如果K 定了的话,那么 histogram 的长度也就定了。如果在整张图像上都用这一个histogram 来统计,那么不管图像的尺寸多大,最终的histogram还是长度为K。很显然,这不是我们希望看到的,这样必然会丢失很多信息。所以就有block representation.

    block representation, 简单来说,就是将图像进行分块, 将图像分成一块一块,每一块都可以用一个histogram 做统计,然后将每一块的histogram 连起来,形成一个长的的histogram。block representation 也是局部特征提取最常用到的一种方式。

    图像分块,也有两种方式,一种是overlap,一种是non-overlap,也就是说块与块之间有重叠,或者没有重叠。在计算HoG的时候,一般都会选择overlap 的分块方式。

    MATLAB 中已经集成了HoG 的函数,可以直接调用库函数计算HoG. 这个函数的调用形式如下:

    [f1, visualization]=extractHOGFeatures(I)

    其中 I 是输入的图像, f1 就是计算得到的HoG 特征,是一个高维的histogram, visualization 是将HoG 进行可视化的一个 object 变量。

    这个函数的输入变量有很多,除了输入图像I 之外,还有一些其它的变量, 一般都会采用默认的缺省值。
    下面逐一介绍这些缺省变量:
    cellsize: [8 ,8], 这是计算HoG的最小块了,每个 8×8 的 cell 都可以得到一个histogram。
    Blocksize: [2, 2], 这是说明一个block 含有多少个cell,[2 2] 意味着一个block 含有 2×2 个cell。
    BlockOverlap: 这是说明block 之间重叠部分的大小,以cell的个数来表示,默认值是一半的cell都有重叠。
    NumBins: 就是上面提到的K,默认值为9。
    UseSignedOrientation: 就是上面提到的角度的取值范围,默认为无符号的角度范围,即 0180

    所以说,采用默认值计算,虽然一个cell 的histogram的长度只有9,但是一个block 有4 个 cell,那么一个block 的histogram 的长度变成了36,对于一张尺寸为64×64 的图像来说,采用overlap 的分块方式,将有 49 个block,所以最终 HoG 的长度是 36×64=1764. 图像尺寸越大,HoG 的长度也会随之增长。不过总得来说,HoG 还算是一种简洁紧凑的特征。比起Gabor,LBP,SIFT 来说,算是比较经济实惠,性价比很高的了。

    最后给出一个例子:

    这里写图片描述

    这里写图片描述

    参考来源
    https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients

    Dalal N, Triggs B. Histograms of oriented gradients for human detection[C]//Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on. IEEE, 2005, 1: 886-893.

  • 相关阅读:
    用vuex写了一个购物车H5页面的示例代码
    css如何引入外部字体?
    移动开发中更好的图片自适应
    常见样式问题七、word-break、word-wrap、white-space区别
    你真的了解word-wrap和word-break的区别吗?
    css中word-break、word-wrap和white-space的区别
    另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
    应该用forEach改变数组的值吗? 原生JS forEach()和map()遍历的异同点
    Vue 全家桶介绍
    Spring MVC配置MyBatis输出SQL
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9412548.html
Copyright © 2011-2022 走看看