一般用到hog做特征描述子的情况就是,这个window只包含目标物体,很少含其他物体。例如经过目标检测提取的行人roi图像,我们用这只包含人的roi图像进行hog特征描述子提取。当然,我们可以直接把这roi部分的图像直接resize为一个行向量,作为SVM的输入,但是这样会有很多干扰,如果进一步提取hog的话,就会有很多边缘细节,能让svm更快收敛,并且模型识别度更好。


cv::HOGDescriptor类的构造函数的各参数的定义:

CV_WRAP HOGDescriptor() :   winSize(64,128),                             // detect window   blockSize(16,16),                            // block 大小   blockStride(8,8),                            // overlap block的滑动步长   cellSize(8,8),                               // cell 大小    nbins(9),                                    // 直方图的bin个数   derivAperture(1),                            // 微分算子核   winSigma(-1),                                // 在window上进行高斯加权   histogramNormType(HOGDescriptor::L2Hys),     // 直方图归一化类型   L2HysThreshold(0.2),                         // L2-norm followed by clipping (limiting the maximum values of v to 0.2) and renormalising  gammaCorrection(true),                       // Gamma校正,去除光照影响  nlevels(HOGDescriptor::DEFAULT_NLEVELS)      // 分层数

以下是一个hog_descriptor.xml的举例:

<?xml version="1.0"?>
<opencv_storage>
<hog_descriptor type_id="opencv-object-detector-hog"><winSize>16 16</winSize><blockSize>8 8</blockSize><blockStride>4 4</blockStride><cellSize>4 4</cellSize><nbins>9</nbins><derivAperture>1</derivAperture><winSigma>2.</winSigma><histogramNormType>0</histogramNormType><L2HysThreshold>2.0000000000000001e-01</L2HysThreshold><gammaCorrection>1</gammaCorrection><nlevels>64</nlevels><signedGradient>1</signedGradient></hog_descriptor>
</opencv_storage>

下面我们来介绍HOG特征的提取过程:

1.图像预处理

  • 灰度化,因为Hog特征提取的是纹理特征,颜色信息不起作用,所以现将彩色图转为灰度图;
  • 归一化,为了提高检测器对光照等干扰因素的鲁棒性,需要对图像进行Gamma校正,以完成对整个图像的归一化,目的是调节图像的对比度,降低局部光照和阴影所造成的影响,同时也可以降低噪音的干扰;
    未经gamma校正和经过gamma校正保存图像信息:未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同时高灰度值时,很多比较接近的灰度值却被保存成不同的值,造成空间浪费。经过gamma校正后,改善了存储的有效性和效率。

​ γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。

​ 伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。

先把像素值f(x,y)f(x,y)f(x,y)进行归一化,把f(x,y)f(x,y)f(x,y)变为(0~1)范围,可以是f(x,y)255\frac{f(x,y)}{255}255f(x,y)​, 然后进行gamma校正:

fγ(x,y)=255∗(f(x,y)255)γ,................f(x,y)→(0,255)f_{\gamma}(x,y)=255*{(\frac{f(x,y)}{255})}^{\gamma} ,................f(x,y)\to(0,255)fγ​(x,y)=255∗(255f(x,y)​)γ,................f(x,y)→(0,255)

乘以255是为了恢复为原来的像素值。

float fGamma=0.5;
pixel_value = std::pow((float)((pixel_value/255.0), fGamma) * 255.0;

即gamma校正就是对像素值做指数运算。

γ\gammaγ一般取1/2, 我们一般使用归一化后的灰度值进行gamma校正。

2.统计细胞单元(Cell)的梯度方向直方图:

将图像划分成小的Cell,将梯度方向映射到180度的范围内,将像素的梯度幅值作为权值进行投影,用梯度方向决定向哪一维进行投影;
假如该像素的梯度方向为20度,梯度幅值为10,那么直方图的第二维就加10
下图是一个细胞单元内的方向梯度直方图,角度分辨率是在180度的范围内,以20度等分,即一个细胞单元的HOG特征是一个9维的向量。


3.统计块(Block)的梯度方向直方图:

统计每个细胞单元内的梯度直方图,形成每个细胞单元的描述子,由cell组成更大的描述子,称为块,将一个块内四个cell的特征向量串联起来就构成了该块的梯度方向直方图,按照一个细胞单元是9维的Hog特征,则一个Block块的Hog特征为4x9=36维。

4.梯度做局部对比度归一化:

由于局部光照的变化,以及前景背景对比度的变化,使得梯度强度的变化范围非常大,这就需要对梯度做局部对比度归一化。这里的策略是针对每个block块进行对比度归一化,一般使用L2-norm。

5.统计窗口(Window)的梯度方向直方图:

只需要将窗口内所有块的Hog特征向量串联起来就得到了Window的Hog特征;

对于一个window窗口,会分成好多个block,是通过设置block滑动的步长stride来求出来的,

例如window是16x16 pixel大小,Block是8x8 pixel大小,blockStride步长是4,那么最终一个window会有(16-8)/4+1=3,即3x3=9个block,那么一个window就是9x36=324维向量,这就是最终的hog描述子。

6.统计整幅图像的梯度方向直方图:

一幅图像可以无重叠的划分为多个Window,这时将所有Window的特征向量串联起来就是整幅图像的Hog特征了,如果Window的大小和图像的大小相同,那么Window的Hog特征就是整幅图像的Hog特征,这也是最终分类使用的特征向量。


为什么要先将图像划分成Cell,再将Cell组成更大的块?

这里的Cell相当于局部特征提取,Block块是几个Cell的组合,是比Cell更大的局部特征,事实上,block块之间是有重叠的,也就是说,每个细胞单元的直方图都会被多次用于最终的描述子的计算。相互重叠是为了区分更细的局部特征,最后由于局部光照和背景的变化,再对块内的特征进行归一化。此方法看起来有冗余,但可以显著的提升性能。实验表明:小尺度梯度,精细的方向采样,相对粗糙的空间采样,和重叠描述子块中高质量的局部对比度归一化都对好的检测效果至关重要。

本文参考了下面的博客,链接:https://www.jianshu.com/p/6f69c751e9e7

【opencv】22.HOG的原理与详细步骤相关推荐

  1. HOG特征提取原理and计算步骤,方向梯度直方图

    HOG简介 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方 ...

  2. python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤

    本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...

  3. alpha shapes提取边界原理及详细步骤

    由Edelsbrunner H提出的alpha shapes算法是一种简单.有效的快速提取边界点算法.其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下: 如下图所示,对于任意形状的平 ...

  4. pca 累积方差贡献率公式_PCA的原理及详细步骤

    一.基本原理 主成分分析是数学上对数据降维的一种方法. 其基本思想是设法将原来众多 的具有一定相关性的指标 X1 , X2 ,-, XP (比如 p 个指标) ,重新组合成一组较 少个数的互不相关的综 ...

  5. 详细的基于opencv svm hog的描述讲解

    (转自http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义: locally normalised histogram ...

  6. 【OpenCV 例程200篇】80. 频率域图像滤波详细步骤

    [OpenCV 例程200篇]80. 频率域图像滤波详细步骤 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 3. 频 ...

  7. DL之LSTM:LSTM算法论文简介(原理、关键步骤、RNN/LSTM/GRU比较、单层和多层的LSTM)、案例应用之详细攻略

    DL之LSTM:LSTM算法论文简介(原理.关键步骤.RNN/LSTM/GRU比较.单层和多层的LSTM).案例应用之详细攻略 目录 LSTM算法简介 1.LSTM算法论文 1.1.LSTM算法相关论 ...

  8. 实战 | OpenCV实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + Python/C++源码)

    点击下方卡片,关注" OpenCV与AI深度学习" 视觉/图像重磅干货,第一时间送达! 导读 本文将介绍使用OpenCV实现纺织物缺陷检测(脏污.油渍.线条破损缺陷)的详细步骤 + ...

  9. OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)

    点击下方卡片,关注" OpenCV与AI深度学习" 视觉/图像重磅干货,第一时间送达! 导读 本文将介绍使用OpenCV实现纺织物缺陷检测(脏污.油渍.线条破损缺陷)的详细步骤 + ...

最新文章

  1. 异常检测概览——孤立森林 效果是最好的
  2. rg1 蓝光危害rg0_LED(护眼)台灯|蓝光那些事
  3. 代码质量评判标准、设计模式、面向对象设计原则速查表
  4. java 新浪短网址生成器,新浪短链接接口被限制?最新新浪短网址api接口
  5. Linux 系统应用编程——网络编程(socket编程)
  6. CentOS 8安装并配置NFS服务
  7. egg框架访问 Mysql 数据库 egg-mysql 增删改查
  8. numpy生成服从特定分布(制定分布)的数据
  9. ApacheCN 捐赠名单 2018
  10. 小Q正在给一条长度为n的道路设计路灯安置方案。 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
  11. EndNote编辑毕业论文格式
  12. 爬取链家二手房信息【爬虫模板】
  13. javaweb JAVA JSP计算机系试题库管理系统的设计与实现JSP题库管理系统 JSP试题管理系统
  14. 用Python爬了微信好友,原来他们是这样的人...
  15. 陈计老师《代数不等式》p15例6的别证
  16. 东北大学计算机学院教授,东北大学之计算机系
  17. 登录邮箱手动连接服务器,outlook2016不能连接exchange2010,自动或手动均不能连接服务器...
  18. div绑定onblur事件
  19. R语言随机森林报错The response has five or fewer unique values. Are you sure you want to do regression原因及解决办法
  20. 升级IBM T43 2668 71U的BIOS

热门文章

  1. HBase在阿里搜索中的应用实践
  2. 【Python】url基础:网络爬虫技术
  3. 有的人在25岁时就死了,但在75岁时才被埋葬:周鸿祎
  4. 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你
  5. 柳青:2017,滴滴实现规模增长和修炼内功的一年
  6. 没好域名?就得给自己换个名
  7. 深入理解分布式技术 - ZooKeeper数据一致性解读
  8. Spring Cloud【Finchley】实战-07异步下单
  9. 支持服务器CPU的ITX主板,Mini-ITX主板能装28核处理器,华擎推出EPC621D4I-2M主板
  10. java dataurl_java url参数去重