机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

2023-05-16

一. 概述

这里主要记录自己的一些感悟,不是很系统。想要详细系统的理论,请参考文末的《图像处理之特征提取》。

个人不是专业cv工程师,很多细节没有深究,描述可能不严谨。
在总结物体检测算法之前先把基础的特征点理论整理一下。

二. HOG

求取前先灰度化然后Gamma校正,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。

HOG主要捕获轮廓信息。统计每个cell的梯度直方图,然后若干个cell直方图组成一个block的descriptor。所有block组成整幅图片的descriptor。

这里注意,同一个block之间的cell之间像素不重叠,但是不同的block之间回有像素重叠。其实每个block更像是一个滑窗,滑窗的步长一般小于block边长。
滑窗和block关系参考下图(图中的cell是8X8,每4个cell组成一个block,水平和垂直上的滑窗步长都是8):
image

那么一个图像的HOG特征维数是多少呢?

这段计算来自参考资料中的《目标检测的图像特征提取之(一)HOG特征》

把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64X128的图像而言,每16X16的像素组成一个cell,每2X2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4X9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64X128的图片,总共有36X7X15=3780个特征。

注意

上面举例说的是64X128图像对应的HOG特征。但是64X128可能是一个更大图片的滑动窗口,这个滑动窗口用于物体检测,比如:

image

由于大滑动窗口之间是由很多重合的,所以opnecv里实现HOG的时候使用了很高明的缓存技术加速计算过程。

特点

对图像几何的和光学的形变都能保持很好的不变性,适合检测行人这种居于有一定刚性的物体,可以容许行人有一些细微的肢体动作。

缺点也有,计算量大,无法处理遮挡。

一个检测行人的效果图

image

三. SIFT

SIFT特征提取的实质

在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

构造过程

通过构建高斯金字塔,保证图像在任何尺度都能有对应的特征点,即保证尺度不变性。为了实现旋转不变性,需要根据检测到的关键点的局部图像结构为特征点赋值。具体做法是用梯度方向直方图。

关键点描述子不但包括关键点,还包括关键点周围对其有贡献的像素点。为了保证旋转不变性,要以特征点为中心,在附近领域内旋转θ角(即旋转为特征点的方向),然后计算采样区域的梯度直方图,形成n维SIFT特征矢量(如128-SIFT)。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理。

下图演示的是旋转到特征点的主方向:

image

下图演示的是求取128维梯度向量:

image

最终每个关键点的值分为几部分:位置(x\y坐标)、尺度(高斯参数)、主方向、和方向梯度描述子(128维)
image

SIFT特征提取的优点

下面3段主要来自《图像处理之特征提取》

  • SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
  • 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
  • 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
  • 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
  • 可扩展性,可以很方便的与其他形式的特征向量进行联合;
  • 需要较少的经验主义知识,易于开发。

SIFT特征提取的缺点

  • 实时性不高,因为要不断地要进行下采样和插值等操作;
  • 有时特征点较少(比如模糊图像);
  • 对边缘光滑的目标无法准确提取特征(比如边缘平滑的图像,检测出的特征点过少,对圆更是无能为力)。

SIFT特征提取可以解决的问题:

目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:
- 目标的旋转、缩放、平移(RST)
- 图像仿射/投影变换(视点viewpoint)
- 光照影响(illumination)
- 目标遮挡(occlusion)
- 杂物场景(clutter)
- 噪声

改进

近来不断有人改进,其中最著名的有 SURF(计算量小,运算速度快,提取的特征点几乎与SIFT相同)和 CSIFT(彩色尺度特征不变变换,顾名思义,可以解决基于彩色图像的SIFT问题)。

应用

SIFT可用于3维地图重建、图片矫正、全景拼接等

image

SIFT / HOG 比较

共同点

都是基于图像中梯度方向直方图的特征提取方法

不同点

SIFT提取的关键点是角点(个人理解:应该是角点+梯度直方图),HOG提取的是边缘特征。

SIFT 特征通常与使用SIFT检测器得到的兴趣点一起使用。这些兴趣点与一个特定的方向和尺度相关联。通常是在对一个图像中的方形区域通过相应的方向和尺度变换后,再计算该区域的SIFT特征。

结合SIFT和HOG方法,可以发现SIFT对于复杂环境下物体的特征提取具有良好的特性;而HOG对于刚性物体的特征提取具有良好的特性。

四.其它传统特征提取的方法

4.1 SURF

前面提到SITF的缺点是如果不借助硬件加速或专门的图像处理器很难达到实现,所以人们就要想办法对SITF算子进行改进,SURF算子便是对SIFT的改进,不过改进之后在算法的运行时间上还是没有质的飞跃。后面要介绍的ORB特征描述算子在运行时间上才是一种质的飞跃。

SURF最终生成的特征点的特征向量维度为64维。

4.2 ORB

ORB特征描述算法的运行时间远优于SIFT与SURF,可用于实时性特征检测。ORB特征基于FAST角点的特征点检测与描述技术,具有尺度与旋转不变性,同时对噪声及透视仿射也具有不变性
ORB特征检测主要分为以下两个步骤:

  • 方向FAST特征点检测: FAST角点检测是一种基于机器学习的快速角点特征检测算法;
  • BRIEF特征描述: BRIEF描述子主要是通过随机选取兴趣点周围区域的若干点来组成小兴趣区域,将这些小兴趣区域的灰度二值化并解析成二进制码串,将串特征作为该特征点的描述子,BRIEF描述子选取关键点附近的区域并对每一位比较其强度大小,然后根据图像块中两个二进制点来判断当前关键点编码是0还是1.因为BRIEF描述子的所有编码都是二进制数的,这样就节省了计算机存储空间。

4.3 LBP

LBP(Local Binary Pattern),局部二值模式是一种描述图像局部纹理的特征算子,该算子是由T.Ojala等人于1994年首次提出的,后经过发展改进可应用于图像特征分析,该算子具有旋转不变性灰度不变性(不怕光照变化)等显著优点。

LBP特征描述的是一种灰度范围内的图像处理操作技术。LBP特征是高效的图像特征分析方法,经过改进与发展已经应用于多个领域之中,特别是人脸识别、表情识别、行人检测领域已经取得了成功。

LBP牲征将窗口中心点与邻域点的关系进行比较,重新编码形成新特征以消除对外界场景对图像的影响,因此一定程度上解决了复杂场景下(光照变换)特征描述问题。

LBP算法根据窗口领域的不同分为经曲LBP和圆形LBP两种。下面分别介绍:

经典LBP

经典LBP的算子窗口为3×3的正方形窗口,以窗口中心像素为阈值,将其相邻8领域像素灰度与中心像素值比较,若中心像素值小于周围像素值,则该中心像素位置被标记为1,否则为0(显然这种规则下,对于中心点大于或等于这两种情况,算法无法区分,后续经过改进引入LBP+与LBP-因子用来区分这两种情况)。图像经过这种遍历操作后,图像就被二值化了,每一个窗口中心的8邻域点都可以由8位二进制数来表示,即可产生256种LBP码,这个LBP码值可以用来反映窗口的区域纹理信息。LBP具体在生成的过程中,先将愿意图像划分为若干个子区域,子区域窗口可根据原图像的尺寸进行调整,而不一定非得为3×3的正方形窗口。一般对于512×640的图像,子区域窗口区域选取大小为16×16.

image
image

圆形LBP

经典LBP用正方形8-领域来描述图像的纹理特征,其缺点是难以满足不同尺寸和频率的需求。Ojala等人对经典LBP进行了改进,提出了将3×3的正方形窗口领域扩展到任意圆形领域。由于圆形LBP采样点在圆形边界上,那么必然会导致部分计算出来的采样点坐标不是整数,因此这里就需要对得到的坐标像素点值进行处理,常用的处理方法是最近邻插值或双线性插值。

放一张SIFT/HOG/LBP优缺点、适用范围对比图:

image

4.4 HAAR

人脸检测最为经典的算法Haar-like特征+Adaboost。这是最为常用的物体检测的方法(最初用于人脸检测),也是用的最多的方法。

  • 训练过程: 输入图像->图像预处理->提取特征->训练分类器(二分类)->得到训练好的模型;

  • 测试过程:输入图像->图像预处理->提取特征->导入模型->二分类(是不是所要检测的物体)。

Haar-like特征是很简单的,无非就是那么几种,如两矩形特征、三矩形特征、对角特征。后来,还加入了边缘特征、线特征、中心环绕特征等。使用积分图可以加速计算特征。最后,使用集成的方法Adaboost进行训练。

image

上图中两个矩形特征,表示出人脸的某些特征。比如中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁两侧比鼻梁的颜色要深。

特征模板可以在子窗口内以“任意”尺寸“任意”放置,每一种形态称为一个特征。

image

个人理解
- HAAR特征只是使用特征模板,计算图像颜色的深浅模式,模板以不同的大小和位置在子图像中滑动,计算出特征值来,交给boost分类器。其实HAAR与LBP还是有点像的,都是灰度差。
- HAAR计算的模式也决定它对旋转没有很好的适应性

总结

我觉得以上特征中主要分为两类:点和面

SIFT、SURF、ORB提取的是关键点的信息,可以用于表示某些图像的细节(或者指纹)。这几个特征可用于图像匹配和3维建模等算法。

HOG、LBP、HAAR提取的是面的信息,可以表示一块区域是什么样的,所以这几个特征可以用于人脸、人体等物体识别。
其中HAAR特征不是很好可视化,另外两种都可以比较容易的可视化出来。

参考资料

  • 一个比较好的概述,本文的主要来源:图像处理之特征提取
  • HOG计算介绍:目标检测的图像特征提取之(一)HOG特征
  • HOG参数简介及Hog特征维数的计算
  • 这里基本把HOG的计算过程说明白了:opencv源码解析之(6):hog源码分析
  • SIFT主要图片来源:sift特征提取算法
  • 图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现
  • 浅析人脸检测之Haar分类器方法
  • Haar特征与积分图
  • 利用积分图像法快速计算Haar特征
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR 的相关文章

  • ORB-SLAM2中四叉树管理特征点

    当从图像金字塔中的每一层图像上提取特征点之后 xff0c 都要先用四叉树技术对这些特征点进行管理 该类中定义了四叉树创建的函数以及树中结点的属性 bool bNoMore xff1a 根据该结点中被分配的特征点的数目来决定是否继续对其进行分
  • ORB_SLAM2+realsense运行稠密建图

    具体的环境及其细节 xff1a Ubuntu18 04 realsenseD435i ROS orbslam2 echo gou的博客 CSDN博客 下载代码 xff1a https github com gaoxiang12 ORBSLA
  • ORB_SLAM2的单目SLAM提高关键帧的个数

    一 前言 最近在结合ORB SLAM2和Map2DFusion xff0c 来做无人机航拍视频建图 xff0c 基本完成了pipeline xff0c 但发现出来的效果没有Map2DFusion官方的效果好 xff08 第一张图是我自己处理
  • 编译ORB报错No rule to make target '/usr/lib/x86_64-linux-gnu/libvtkproj4-6.2.so.6.2.0'

    报错现象 xff1a No rule to make target span class token string 39 usr lib x86 64 linux gnu libvtkproj4 6 2 so 6 2 0 39 span 解
  • ORB-SLAM2中关键知识点总结

    目录 1 ORB SLAM2的总体框架是怎样的 xff1f 2 ORB SLAM2是怎样完成初始化的 xff1f 3 ORB SLAM2是如何进行Tracking的 xff1f 4 ORB SLAM2是如何选取关键帧的 xff1f 5 OR
  • OpenCV实战5: LBP级联分类器实现人脸检测

    OpenCV中的HAAR与LBP数据 HAAR特征数据 参看 haarcascade frontalface alt xml 各标签 LBP特征数据 参看 lbpcascade frontalface xml 各标签 HAAR与LBP的区别
  • Opencv的使用小教程4——HOG特征及其python代码实现

    Opencv的使用小教程4 HOG特征及其python代码实现 hog特征是什么 hog的实现步骤 梯度直方图的概念 python代码实现 1 使用scikit image库 2 源码代码实现 好好学习噢 hog特征是什么 HOG特征即方向
  • 在 ubuntu 上包含非自由 openCV 2.4.10

    我已经使用这个在 ubuntu 上安装了 OpenCVlink我正在尝试使用 SURF 描述符 我知道他们将这些类型的描述符的位置更改为非自由模块 因此我们需要包含它 如下所示 include opencv2 nonfree feature
  • 如何在OpenCV中利用SIFT提取的特征得到目标物体周围的矩形

    我正在 OpenCV 中进行对象检测项目 其中包括将模板图像中的对象与参考图像进行匹配 使用 SIFT 算法可以准确地检测和匹配特征 但我想要围绕匹配特征的矩形 我的算法使用 KD Tree est ean First 技术来获取匹配项 如
  • Python+OpenCV 3 - 无法使用SIFT

    我从最新的源代码编译了 OpenCV 3 和 opencv contrib 我将其安装到 Python 2 7 的 site packages 文件夹中 我可以按照以下位置的所有教程进行操作http docs opencv org trun
  • 使用图像进行相似图像搜索

    我正在开发一个项目 其中将检查两个图像的相似性 例如 Google Image Search by image 我通过 Google 以及包括 stackoverflow 在内的各种网站进行了搜索 并了解了各种技术 例如直方图 筛选 傅里叶
  • 如何使用 SIFT 和 OpenCV 在图像中搜索目标?

    我正在开发一个简单的扑克牌检测程序 现在我有一个有效的筛选算法here http www aishack in 2010 07 implementing sift in opencv 我在卡片周围创建了一些边界框 然后我在要搜索的卡上使用
  • 在 OpenCV 中使用 SURF 测量模式识别的准确性

    我目前正在 OpenCV 中使用 SURF 进行模式识别 到目前为止我有什么 我已经用 C 编写了一个程序 我可以在其中选择源图像和我想要查找的模板 之后 我将两张图片传输到 C dll 中 在其中使用 OpenCV SURFDetecto
  • SIFT 算法中奇怪的 Octave 值?

    我在 opencv 代码中使用 sift 算法从图像中获取描述符和关键点 我的代码是 Ptr
  • 图像检测功能:SIFT、HISTOGRAM 和 EDGE

    我正在致力于使用 3 种不同的功能 即 SIFT HISTOGRAM 和 EGDE 来开发对象分类器 然而 这 3 个特征具有不同的维度向量 例如SIFT 128 维 历史记录 256 现在 由于大小不同 这些特征无法连接成一个向量 我打算
  • SIFT 描述符的计算复杂度?

    The SIFT描述符 http www aishack in tutorials sift scale invariant feature transform introduction 是 David Lowe 提出的局部描述符 该描述符
  • 模块对象没有属性“DescriptorExtractor_create()”

    我安装了 opencv3 1 0 并正确安装了 opencv contrib 但收到错误 no module DescriptorExtractor create 一切都很好 建议 在 OpenCV 3 x 中 SIFT 和 SURF 已被
  • vl_dsift 尝试获取每个像素的特征向量

    我正在尝试使用 vl dsift 获取每个像素的 128 1 特征向量 因此我希望得到的矩阵具有大小 128 像素数 然而 当我在尺寸为 192 168 的图像上使用它时 生成的描述符给出尺寸 128 31 185 binsize 为 1
  • 为什么我们需要 crossCheckMatching 功能?

    我正在阅读很多使用特征提取 sift ecc 进行对象检测的文章 在计算两个图像上的描述符后 为了获得良好的匹配 他们使用了 crossCheckMatching 发现于样本 cpp descritpor extractor matcher
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 13_FreeRTOS消息队列

    目录 队列简介 FreeRTOS队列特点 队列操作基本过程 队列结构体介绍 队列结构体整体示意图 队列相关API函数介绍 创建队列相关API函数介绍 往队列写入消息API函数 往队列写入消息函数入口参数解析 从队列读取消息API函数 实验源
  • golang XML解析

    使用微信支付的时候遇到这样一种情况 xff1a 支付成功之后微信会发送一个通知过来 xff0c 这个通知包含xml格式的数据 xff0c 其中有一个字段是这样的 xff1a coupon id n 代 金 券
  • FreeRTOS系列-- heap_4.c内存管理分析

    FreeRTOS系列 heap 4 c内存管理分析 heap 4 c简介理解heap 4 c的关键点图示heap 4 c内存申请过程图示heap 4 c内存合并过程内存初始化源码分析内存申请源码分析内存释放分析空闲块内存合并源码分析 hea
  • Cordova概述

    Cordova Apache Cordova is an open source mobile development framework It allows you to use standard web technologies HTM
  • Openstack学习(增加卷迁移限速)

    声明 xff1a 本博客欢迎转发 xff0c 但请保留原作者信息 博客地址 xff1a http blog csdn net halcyonbaby 内容系本人学习 研究和总结 xff0c 如有雷同 xff0c 实属荣幸 xff01 Ope
  • dht11 新手原理详解(附代码)

    dht11详解 dht11原理 简介 DHT11作为一款低价 入门级的温湿度传感器 xff0c 常用于我们的单片机设计实例中 它应用专用的数字模块采集技术和温湿度传感技术 xff0c 确保产品具有极高的可靠性与卓越的长期稳定性 传感器包括一
  • git推送报错 Your branch is ahead of 'origin/master' by 1 commit

    当出现no changes added to commit use git add and or git commit a git commit之后 xff0c 用git status xff0c 打印信息为 xff1a Your bran
  • ubuntu如何降级gcc

    ubuntu版本 xff1a ubuntu 18 04 安装指定版本的gcc g 43 43 xff0c 然后做如下链接 sudo apt get install gcc 4 5 g 43 43 4 5 cpp 4 5 gcc 4 5 mu
  • arm-linux开发环境之(busybox-ls命令)终端显示颜色

    在开发板终端中输入ls命令后终端文件夹和文件显示颜色 linux主机 xff1a ubuntu 12 04 交叉编译器 xff1a gcc version 4 6 2 20110630 prerelease 开发板kernel xff1a
  • 活体识别5:论文笔记之FeatherNets

    说明 这篇文章是这次比赛的第三名 xff1a ChaLearn Face Anti spoofing Attack Detection Challenge 64 CVPR2019 xff0c 此次比赛项目是人脸防欺诈攻击检测 论文标题 xf
  • c++中使用dlopen加载动态库中带类参数的函数

    说明 我一直都知道dlopen的大概用法 但是dlopen毕竟是c语言的函数 xff0c 能否加载带c 43 43 类型传参的函数 xff0c 我有点不确定 今天有空验证了下 xff0c 是可以的 extern C 只影响了函数在动态库中的
  • 将pytorch的pth文件固化为pt文件

    说明 我参考了一个开源的人像语义分割项目mobile phone human matting xff0c 这个项目提供了预训练模型 xff0c 我想要将该模型固化 xff0c 然后转换格式后在嵌入式端使用 该项目保存模型的代码如下 xff1
  • ARM汇编1:如何在C语言中使用汇编

    如何在C语言中使用汇编语言 我最近对ARM的NEON编程有兴趣 xff0c 主要是为了想学习一些矩阵计算加速相关的知识 但是我又不想写纯粹的汇编语言 xff0c 我想在C语言中嵌入汇编来使用 经过检索学习 xff0c 我找到两种可行的方式
  • EEPROM和flash的区别

    之前对各种存储器一直不太清楚 xff0c 今天总结一下 存储器分为两大类 xff1a ram和rom ram就不讲了 xff0c 今天主要讨论rom rom最初不能编程 xff0c 出厂什么内容就永远什么内容 xff0c 不灵活 后来出现了
  • python中import cv2遇到的错误及安装方法

    从x86 64 43 ubuntu14 04 43 python3 5中import cv2 opencv3 3 遇到以下错误 xff1a ImportError libSM so 6 cannot open shared object f
  • 多目标跟踪-MOT16数据集格式介绍

    背景介绍 多目标跟踪的问题是这样的 xff1a 有一段视频 xff0c 视频是由 N 个 连续帧构成的 从第一帧到最后一帧 xff0c 里面有多个目标 xff0c 不断地有出有进 xff0c 不断地运动 我们的目的是对每个目标 xff0c
  • opencv-python的格式转换 RGB与BGR互转

    opencv读取图片的默认像素排列是BGR xff0c 和很多其他软件不一致 xff0c 需要转换 这里转一下国外博客的一个方法 xff0c 基于python语言 BGR to RGB OpenCV image to Matplotlib
  • np.maximum()函数详解——将数组中小于某值的数用0代替

    目标 xff1a 把数组中小于某个值的数都设为0 np max a axis 61 None out 61 None keepdims 61 False 求a中的最大值 np maximum xff1a a b out 61 自定义 a 与
  • python-opencv 使用LBP特征检测人脸

    概述 最近在做人脸检测相关功能 xff0c 目前注意到比较传统 xff08 非深度 xff09 人脸检测特征包括harr和LBP HOG用于行人检测更多些 xff0c opencv包括了这两种特征算法 xff0c 并且相对来说 xff0c
  • 机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

    一 概述 这里主要记录自己的一些感悟 xff0c 不是很系统 想要详细系统的理论 xff0c 请参考文末的 图像处理之特征提取 个人不是专业cv工程师 xff0c 很多细节没有深究 xff0c 描述可能不严谨 在总结物体检测算法之前先把基础