详解opencv的HOG描述子维度数目的计算原理
opencv的HOG描述子与sift、surf、orb描述子一样,都是属于同一类型的描述符,这种描述符可以作为SVM、ANN的模型输入数据。
如何更科学的使用HOG描述符,主要取决于HOG的参数是如何转为维度数目的。
下面是python代码对一个图像为40x40大小生成HOG描述子的过程。
import cv2
import numpy as npgray=np.ones(shape=(40,40),dtype=np.uint8)'''
比如上面这副图像的大小为40*40
定义hog描述子的第一个值是滑动窗口的大小
滑动窗口大小为16*16
每一个块大小设为8*8
块的步长为4*4 这样块移动一次会重叠
单元的大小为4*4 代表每个单元会有9个方向的梯度值
'''#定义hog描述子对象
winSize = (16,16)
blockSize = (8,8)
blockStride = (4,4)
cellSize = (4,4)
nbins =9
hog=cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)#然后进行描述子检测
'''
然后需要定义滑动窗口的步长 以及滑动窗口如果移动到边缘不够是否需要进行填充
最好也让滑动窗口有重叠
'''
winStride = (8,8)
padding = (0,0)hog_ret=hog.compute(gray,winStride,padding)
#结果为(5184, 1)
print(hog_ret.shape)
运行这个代码,可以看到hog描述子的数目为5184,接下来将说明5184这个数目是如何得到的。
为了简化计算,将滑动窗口简写为win、块简写为b、块的步长简写为bs、单元简写为c、单元中直方图数目简写为nb。
将图像简写为img、滑动窗口步长简写为ws、填充简写为p。
各个区域的宽为w、高为h。
HOG描述子就是各个方向的颜色梯度值。
第一步讲解每个滑动窗口的HOG描述子数目。
下图中绿色区域为每一个滑动窗口,像素大小为16x16
对于每个大小为16x16的滑动窗口,我们定义的块的大小为8x8,如下图蓝色区域
因为每个单元cell的大小为4x4,这里注意块的大小必须是单元大小的整数倍。因此一个块中可以存放4个单元,计算公式为(b_w/c_w)x(b_h/c_h)=(8/4)(8/4)=2x2=4
每个单元中有9个直方图,这里说明下9个直方图代表什么意思,将每个单元四周一圈360度等分为9个角度,每个角度计算一个颜色梯度,这样就得到了单元的九个颜色梯度直方图。
因此每个块的直方图数目为:单元的数目4x9=36
一个块中有36个直方图描述子。
接下来计算一个窗口中有多少个块。
块在窗口中的移动过程如下,因为块的步长为4x4
从上面块的移动过程可以看出,这个滑动窗口中有9个块,横向有3种,纵向有3中,因此3x3=9
计算公式为((win_w-b_w)/bs_w+1)x((win_h-b_n)/bs_h+1)=
((16-8)/4+1)x((16-8)/4+1)=3x3=9
因此可以得到一个滑动窗口中的描述子的总数。
一个块中有4个单元,每个单元有9个描述子,从而得到一个块中有4x9=36个描述子。
每个滑动窗口中有9个块,因此每个滑动窗口中的描述子数目为9x36=324个。
计算了每个滑动窗口中描述子的数目,接着就需要计算一个图像中有多少个滑动窗口。
滑动窗口的步长为8x8
如图所示为滑动窗口在图像中的移动方式,由此可见从左到右有4中排列方式,从上到下有4种排列方式,一共有16种。
计算公式为((img_w-win_w)/ws_w+1)x((img_h-win_h)/ws_h+1)=
((40-16)/8+1)((40-16)/8+1)=4x4=16
由此可知,一个图像中可以存在16个滑动窗口。
由此HOG的描述子数目为16x324=5184。这个数目正好与python代码上计算的一致。
以上的参数设置是滑动窗口没有进行填充,如果把填充设置为8x8
padding = (8,8)
那么python运行计算的描述子数目为11664。
因为填充相当于把图像的四个方向左右上下均追加8个像素,因此图像的宽变为40+82=56,图像的高度也是40+8x2=56。
计算公式为((img_w+p_w2-win_w)/ws_w+1)((img_h+p_h2-win_h)/ws_h+1)=
((40+82-16)/8+1)((40+8x2-16)/8+1)=6x6=36
填充了像素为8x8,图像就有36个滑动窗口。
36x324=11664
以上就是opencvHOG描述子维度数目计算的详细过程。
详解opencv的HOG描述子维度数目的计算原理相关推荐
- OpenCV-Python实战(10)——详解 OpenCV 轮廓检测
OpenCV-Python实战(10)--详解 OpenCV 轮廓检测 0. 前言 1. 轮廓介绍 2. 轮廓检测 3. 轮廓压缩 4. 图像矩 4. 1 一些基于矩的对象特征 4.2 Hu 不变矩 ...
- 详解OpenCV中的Lucas Kanade稀疏光流单应追踪器
详解OpenCV中的Lucas Kanade稀疏光流单应追踪器 1. 效果图 2. 源码 参考 这篇博客将详细介绍OpenCV中的Lucas Kanade稀疏光流单应追踪器. 光流是由物体或相机的运动 ...
- 详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()
详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly() 函数ellipse2Poly()可用于近似计算椭圆曲线的像素坐标. 而前面介绍过的函数ellipse()则是直接在图像中绘制椭 ...
- 详解 OpenCV 透视变换原理 及 实例
OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...
- NVIDIA Jetson TK1学习与开发(七):图文详解OpenCV在Jetson TK1上的安装和使用
图文详解OpenCV在Jetson TK1上的安装和使用 本文介绍如何在Jetson TK1上安装并且使用OpenCV,并给出了示例,供大家参考学习. 1.Jetson TK1平台的OpenCV优化包 ...
- 详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示
详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示 目录 01-详解函数imread():读取图像文件 02-详解函数imshow():显示图像 03-使用 ...
- 三维空间刚体运动5:详解SLAM中显示机器人运动轨迹及相机位姿(原理流程)
三维空间刚体运动5:详解SLAM中显示机器人运动轨迹及相机位姿(原理流程) 一.显示运动轨迹原理讲解 二.前期准备 三.git管理子模块及克隆源代码 1.学习使用Git Submodule 2.克隆源 ...
- 25.消除不相关的细节/裂缝桥接(形态学 --膨胀与腐蚀详解 )--- OpenCV从零开始到图像(人脸 + 物体)识别系列
本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 形态 ...
- opencv python BRIEF描述子
BRIEF (Binary Robust Independent Elementary Features) 理论 我们知道SIFT使用128-dim向量作为描述符,由于它使用浮点数,因此基本上需要51 ...
- mysql explain详解_数据库mysql(1)——B+TREE索引原理
一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...
最新文章
- python 遍历字典
- 面相对象的topSort和递推【ural1022/ural1017】
- html没有css还有用吗,如果css足够强大了,你还会用编程的方式实现去实现css已有的功能吗?_html/css_WEB-ITnose...
- c语言如何给阻塞函数加超时,在代码中写一个延时而不阻塞的函数方法,给大家的参考 - 单片机 -
电子工程世界-论坛 -
手机版...
- SoapUI简介和入门实例解析
- bilateral filter双边滤波器的通俗理解
- .NET Core amp; ASP.NET Core 1.0在Redhat峰会上正式发布
- 番石榴的EventBus –简单的发布者/订阅者
- MySQL 排序、分页查询、聚合查询
- httpd的一些知识点
- jQuery Mobile中尾部栏footer的data-*选项
- 机器学习(六)——PCA降维处理
- php基础--变量及作用域
- Windows jmeter安装
- 经济应用数学基础二 线性代数 (第四版) 赵树嫄 编| 中国人大版 课后习题答案
- 软件测试电脑功率,姗姗来迟的测试——功率计实测电脑耗电情况之三【i3 2100 + H61 配置篇】...
- 生信漫谈如何绘制蛋白序列的二级结构可视化图
- 达摩院高清人像美肤模型ABPN CVPR论文深入解读
- C# 模拟 HTTP POST请求
- 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】