目录

简介

提取HOG特征的步骤

1、预处理获取要计算其特征的输入图像

2、计算图像的梯度

3、计算8×8细胞梯度直方图

4、直方图归一化

5、计算HOG特征向量

Opencv利用HOG特征实现行人检测


简介

HOG特征与SVM分类器结合,已经被广泛应用于图像识别中,尤其在行人检测,HOG的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域,称为cells,每个cell生成一个方向梯度直方图或者cell中像素的边缘方向,这些直方图的组合可表示出所检测目标的目标的HOG特征。

提取HOG特征的步骤

具体计算图像HOG特征的方法步骤如下:

1、预处理获取要计算其特征的输入图像

如前所述的HOG特征用于行人检测,是在64×128大小图像计算,当然,图像可能是任意大小的。通常在多个尺度上分析多个图像位置,唯一的限制是被分析的滑动窗口(win)具有固定的长宽比(纵横比)。在我们的例子中,滑动窗口需要有一个长宽比为1:2。然后再将滑动窗口的图像调整为128x64像素的大小,该设置在行人检测任务中可以获得更好的结果。为了说明这一点,下面展示了一个大尺寸的512×480图像。我们选择一块大小100×200的区域计算我们的HOG特征。并且调整我们裁剪的窗口图像大小为64×128。

图 9-8 获得输入图像

2、计算图像的梯度

梯度是通过结合图像的大小和角度来获得的。考虑3x3像素的块,首先计算每个像素的。对于每个像素值,首先使用以下公式计算

其中r为像素点的横坐标,c为像素点的纵坐标,为图像像素点的像素值,在计算  后,使用下面提到的公式计算每个像素的梯度幅值和角度:

使用opencv中内核大小为1的Sobel算子实现计算图像的水平和垂直梯度,并计算每个像素的梯度和角度如下:

import cv2
#导入图片
img = cv2.imread("G:\workdate\python\demo\image\soccer2.bmp",0)
#计算水平和垂直梯度
gx=cv2.Sobel(img,cv2.CV_32F,1,0,ksize=1)
gy=cv2.Sobel(img,cv2.CV_32F,0,1,ksize=1)
#计算梯度图像与角度图像
m,arg=cv2.cartToPolar(gx,gy)
cv2.imshow("gx",gx)
cv2.imshow("gy",gy)
cv2.imshow("m",m)
cv2.imshow("arg",arg)
cv2.waitKey(0)

图 9-9 运行结果

如图9所示图水平梯度在垂直线方向延伸,垂直梯度在水平线方向延伸。

3、计算8×8细胞梯度直方图

在获得每个像素的梯度后,梯度矩阵(梯度和角度矩阵)被划分为8x16个大小为8x8的单元细胞(cell),如下图10所示。

图 9-10 8x8细胞单元

我们之所以把图像分为8×8细胞是因为它提供了一个紧凑的特征表示。8×8单元细胞包含8x8 = 64像素值。这个单元细胞梯度每像素包含2个值(大小和方向),那就变成8x8x2 = 128个数。通过后面我们会看到这128个数字是用9-bin直方图(可存储为长度9的数组,通俗地说是分别装到9个箱子里)表示。不仅是表示更简洁,计算在细胞梯度直方图具有更强的鲁棒性。个别的颜色梯度可能有噪音,但用一个8x8单元细胞梯度来表示梯度直方图对噪声不敏感,换句话说,就是受噪音影响不大。如图11所示,让我们看一个8×8单元细胞的图像梯度的面貌。

图 9-11 细胞梯度与角度矩阵

上图显示了用箭头表示梯度的图像的贴片,箭头显示梯度的方向,其长度显示大小。注意箭头的方向指向强度的变化方向,其大小表示差异的大小。在右边,我们看到原始的数字表示在8×8细胞有一个小的差异,那就是角度是0度和180度的梯度,而不是0到360度之间。这些被称为“无符号”渐变,因为梯度正值和它的负值用相同的数字表示。换句话说,梯度箭头和与之相对的180度箭头被认为是相同的。但是,为什么不使用0 - 360度呢?经验表明,无符号梯度课要更好地用于行人检测。在计算HOG的一些实现方法中,将允许您指定是否使用带符号的渐变。下面我们创建一个8×8细胞梯度直方图。直方图包含9个数对应角度0, 20, 40…160,其实现过程如图12所示。

图 9-12  计算8×8细胞梯度直方图

如上图所示,我们寻找在8×8细胞梯度和方向矩阵同一位置的数值。根据方向选择箱子,并根据大小选择投票(进入箱子的值)。让我们首先关注环绕在蓝色中的像素。它的角度(方向)为80度,大小为2。所以它放入到第五个箱子。用红色包围的像素的梯度方向为10度,大小为4。由于10度是0和20之间的一半,所以像素的也是均匀地分成两个箱子。还有一个细节需要注意。如果角度大于160度,则在160到180之间,我们知道角度绕成0和180相等。比如角度为165度的像素正比于0度的箱子和160度的箱子。从180-165/165-160=3可知,梯度数值在分配时,0箱子分4/1,160箱子分4/3。

4、直方图归一化

在前面的步骤中,我们根据图像的梯度创建了一个直方图。图像的梯度对整体亮度是敏感的。如果通过将所有像素值除以2来使图像变暗,则梯度矩阵元素将改变一半,因此直方图值将改变一半。理想情况下,我们希望特征描述符不受光照变化的影响。换句话说,我们希望使直方图归一化,这样它们不会受到光照变化的影响。你可能会认为在计算HOG特征时可以将9x1的直方图直接看成的9×1矢量进行归一化。可以是可以,但更好的办法是归一化一个更大尺寸的16×16的图像块,而不是8×8的单元细胞矩阵大小。16×16图像块用4个直方图可级联成一个36×1元矢量,最后归一化36×1的向量。

5、计算HOG特征向量

计算整个图像的单元细胞后的最终的特征向量,36×1载体连接成一个巨大的载体。这个向量的大小是多少?原图截取100*200—>resize—>64*128,我们有多少个16×16图像块吗?有7个水平和15个垂直位置,总共105个16×16图像块。每16×16块由36×1矢量表示。所以当我们连接成一个巨大的载体,最后得到了36×105 = 3780维向量。

用opencv实现输入图像的HOG特征的可视化代码如下:

from skimage import feature, exposure
import cv2
image = cv2.imread('image/soccer2.bmp')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
fd, hog_image = feature.hog(image,orientations=3,pixels_per_cell=(8, 8), cells_per_block=(2, 2), block_norm='L2-Hys',feature_vector=True,visualize=True)
cv2.imshow('hog', hog_image)
cv2.waitKey(0)

图 9-13 hog特征可视化

HOG 是根据细胞单元格创建的,这些细胞单元格组合成区块,并且区块之间可以重叠,因此很难对它进行直观显示。不过可以通过显示每个单元格的直方图来表示HOG。如图14所示,显示方向直方图时,不使用柱状图,而是采用更加直观的星形图,每个线条的方向与 bin 对应,长度与 bin 的数量成正比。可以用这种方法在图像上绘制 HOG。

Opencv利用HOG特征实现行人检测

Opencv利用HOG特征实现行人检测,包括了HOG的特征提取和SVM识别两部分。利用OpenCV自带的行人检测其实现行人检测主要有三步:

  1. 初始化HOG描述子
  2. 设置HOG中的SVM为已训练好的SVM模型;
  3. 读取图像,检测,并在图像中显示出检测结果

使用opencv的自带的hog目标检测模型结合其训练好的SVM实现行人检测的代码如下:

import cv2
base_path = 'image/people.jpg'#待检测图像的文件路径
img=cv2.imread(base_path)
hog = cv2.HOGDescriptor()  #初始化HOG描述子
# 设置支持向量机,其为一个预先训练好的行人检测器
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
#检测行人
rects, wei = hog.detectMultiScale(img, winStride=(4, 4), padding=(8, 8), scale=1.05)
for (x, y, w, h) in rects: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) #将检测结果在图像中圈出来
cv2.imshow("people detect", img) #显示图像
cv2.waitKey(0)

图 9-18 行人检测

如上图所示我们使用opencv自带模型很好的实现了图像中行人的检测,下面对我们用到的检测器进行简单的介绍。

cv2.HOGDescriptor():OpenCV中的HOG特征提取功能使用了HOGDescriptor这个类来进行封装。其中包含了许多函数,下面列举了常用的一些函数:

  1. getDetectorSize(self):获得设置的hog描述子的维数
  2. compute(self,,img,,winStride=None,padding=None, locations=None):计算输入的检测窗口的hog描述子
  3. computeGradient(self,,img,grad,angleOfs,paddingTL=None, paddingBR=None):计算输入图像的梯度幅度图像
  4. setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()):设置训练好的支持向量机检测器
  5. detectMultiScale(self,img,hitThreshold=None,winStride=None,padding=None,scale=None, finalThreshold=None, useMeanshiftGrouping=None):对输入图像进行检测,并且返回目标位置与目标的权重。

目标检测(三)传统目标检测与识别的特征提取——基于HOG特征的目标检测原理相关推荐

  1. 基于线条特征的机场检测算法——LSD直线检测算法、平行线组提取和聚类

    遥感图像的机场检测是图像处理在军事以及航空领域一个重要的应用,现有一些机场提取方法利用显著性特征获取机场区域的方法容易使得机场提取不够完整,而且会混入过多的虚警区域,原因在于图像的显著性特征并能用来表 ...

  2. 【CVPR 2021】基于解耦特征的目标检测知识蒸馏:Distilling Object Detectors via Decoupled Features

    [CVPR 2021]基于解耦特征的目标检测知识蒸馏:Distilling Object Detectors via Decoupled Features 论文地址: 主要问题: 主要思路: 具体实现 ...

  3. 【MATLAB项目实战】基于RGB特征的火焰检测

    首先数据转换为帧图像 clc; clear all;obj = VideoReader('1.mp4');%输入视频位置 numFrames = obj.NumberOfFrames;% 帧的总数 f ...

  4. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  5. 利用HOG特征进行人体检测--简述

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

  6. 基于HOG特征的Adaboost行人检测

    原地址:http://blog.csdn.net/van_ruin/article/details/9166591 1.方向梯度直方图(Histogramof Oriented Gradient, H ...

  7. 计算机自动分类识别的基本原理,基于叶片特征的计算机自动植物种类识别研究...

    摘要: 随着计算机图像处理和模式识别技术的发展,计算机植物种类的自动识别与分类也就成为了可能.目前植物识别和分类主要由人工完成,它的主要依据是植物的外观特征.由于植物的外观特征可以通过数字图像方式获得 ...

  8. 基于SURF特征的目标检测

    转战matlab了.步骤说一下: 目标图obj 含目标的场景图scene 载入图像 分别检测SURF特征点 分别提取SURF描述子,即特征向量 用两个特征相互匹配 利用匹配结果计算两者之间的trans ...

  9. 【火灾检测】基于HSV特征实现火灾检测附matlab代码

    1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题,提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法.火焰颜色特征是基于RGB颜色模型中的R,G,B三 ...

最新文章

  1. Ruby DSL介绍及其在测试数据构造中的使用(2)
  2. c#_winform_选择文件保存路径
  3. 幅度调制(AM调制、DSB(双边带)调制、SSB、VSB)
  4. Android Studio 设置代码提示和代码自动补全快捷键
  5. 深入浅出Lua虚拟机
  6. 面向对象的三大特性之三:封装
  7. mysql 日期分隔符_sql中的日期处理
  8. FFmpeg源代码简单分析:结构体成员管理系统-AVClass
  9. “数据治理”:重构和愿景
  10. 使用canvas标签绘制圆形、三角形
  11. 古琴十大名曲——唐畅古琴
  12. 花样16流水灯c语言程序,单片机控制花样流水灯原理图及程序
  13. app logo显示不全没有铺满
  14. python的pillow给图片加文字_python PIL(pillow)图像处理-图片上添加文字
  15. AMD启用虚拟化(AMD-V)
  16. 一般企业应用上云架构实践
  17. 关于计算机专业励志的话,电脑行业励志语录
  18. 编程规则 - 1 概述 -- 帮助你成长为优秀的程序员 杰出的软件工程师、设计师、分析师和架构师
  19. 记录R语言及python实现地质图形展示
  20. 二分类指标Precision、Recall、Accuracy、F score、TPR、FPR、MCC

热门文章

  1. Access数据库的加密与解密
  2. Flink 在风控场景实时特征落地实战
  3. 用灌水法解NOIP2017提高组D2第一题:奶酪
  4. 学习使用微信小程序动态获取当前时间并实时跳动
  5. 计算机色温调整,如何调节计算机屏幕的色温
  6. 素数筛线性筛详细详解(个人总结思路超长版)
  7. Java泛型方法与普通成员方法以及案例说明(五)
  8. mysql如何加索引的时候不锁表
  9. 记录一下git 打patch导入patch遇到的问题
  10. 新概念英语学习笔记-1