特征检测技术总结

写在前面

对于模式识别,到了研二终于发自内心的体会到它的应用领域已经广阔到一种不可描述的状态,大到人工智能,数据挖掘,,机器学习,小到特征提取,图像处理,都会有模式识别的影子与你相随,这种感觉就像数学领域中的欧拉,拉格朗日,与柯西,爷仨~贯穿你的整个学习过程,如影随形。在读研以前,从没去思考过计算机是如何识别图片的、如何认知文字的、如何回答语音的……直到后来想做三维模型检索相关领域的内容,本以为不会是太难的东西,到后来才发现,这里面的内容足够我消化半辈子了……我这个人大概率还是脑子太笨了,最开始的时候,通过各种手段去了解图像处理,深度学习这方面的知识,很长时间以来,都没有深入理解这些内容的精髓,没有清晰的知识脉络。什么是滤波器,什么是卷积核,什么是池化,什么是采样,什么是激活函数,什么是分类器,sigmoid是干什么的,全连接是干什么的,怎么有的CNN,什么是前馈网络,什么是反向传递。那些乱七八糟的算子有什么用,SIFT,SVM跟这些东西又是什么关系……等等等等一系列的名称一下子涌过来,搞得我迷迷糊糊。
通过不断地学习,不断地温习以往的知识,我开始有了一点点清晰一点的知识脉络。也感谢自己养成了写博客的习惯,今后会慢慢地将自己的理解与认知写下来,理清自己的思路与见解,也供他人参考。如果有读者看到一些错误或者有待商榷的地方,希望您能够不吝指出,与我联系,共同进步。

从介绍模式识别开始

刚读研一的时候,张老师让我读《模式识别》(《Pattern Recognition》)这本书。而实际在我真正接触图像识别的工程之前,这本书我仅仅看了第一章,仅仅看了一些概念性的东西,而后面的算法讲解,贝叶斯决策,分类器,支持向量机,多层感知机等等,都因为内容中的公式太多,直接就怕了……感觉这本书会非常的难啃。而后来,在我拜读OpenCV中的关于SVM的算法讲解的时候,有一些地方弄不明白,魏老师让我去看模式识别的分类器这部分,我才茅塞顿开。慢慢也开始进入了良性循环的节奏,看一些公式也不闹心了,也知道一篇论文的重点该看哪里了。非常的nice。

PS:假如我不干编程工作了,大概率可以当个讲师吧!哈哈哈,因为遇到的大部分老师讲一些理论的时候讲的是真的烂啊!!不怪学生们不爱听~自己真正弄明白一些理论之后,真的觉得自己的吹毛求疵,刨根问底都是值得的!研究生阶段的学习,不能是单纯的调用函数接口,还是要深入的了解这个函数。社会的精英阶层,领导阶层什么时候才能真正意识到我们国家的教育问题呢?富人家的孩子暂且可以摆脱经济压力,去国外镀金,花更多的时间投资在个人能力的提升上,但是那些群穷人家的孩子怎么办呢?这大概就是差距慢慢拉大的原因吧~高等教育的改革势在必行,如果能够因材施教,学生找得到自己的兴趣方向,使得学习的驱动力来自于自身,而不是强行往某个领域推。。。我想这样会从上往下传导出一种新的活力吧!估计也不会有这么多人的人生目标是逃离高考大省了吧!

模式识别简介

传统的模式识别包括且不仅限于一下内容:

  • 语音识别
  • 自然语言识别
  • 字符与文字识别
  • 图像识别
  • 动作识别

而现在比较流行的甚至可以说烂大街的深度学习,也属于模式识别建立分类器的范畴,而这个范畴又包括了

  • 监督模式识别 (supervised pattern recognition)
  • 非监督模式识别 (unsupervised pattern recognition)

而对于监督式模式识别,我们了解的大多数深度学习模型都属于这个范畴。这两种问题的处理方式是有一些区别的。

  • 对于处理监督模式识别问题的一般步骤是:
  • 分析问题,分析给定数据哪些因素可以与分类有关。
  • 原始特征获取。
  • 特征提取与选择。
  • 分类器设计,用已知样本进行分类训练。
  • 分类决策。
  • 对于处理非监督模式识别问题的一般步骤是:
  • 分析问题;
  • 原始特征获取;
  • 特征提取与选择;
  • 聚类分析;
  • 结果解释;
    对于模式识别中的识别而言,引用维基百科中模式识别的内容来简单解释:
    识别过程与人类的学习过程相似。以光学字符识别之“汉字识别”为例:首先将汉字图像进行处理,抽取主要表达特征并将特征与汉字的代码存在计算机中。就像老师教我们“这个字叫什么、如何写”记在大脑中。这一过程叫做“训练”。识别过程就是将输入的汉字图像经处理后与计算机中的所有字进行比较,找出最相近的字就是识别结果。这一过程叫做“匹配”。
    所以我们大致可以知道模式识别至少包含两个最重要的过程:特征检测与特征匹配(也就是识别)。

特征检测(特征提取)

特征检测也是特征提取,它是计算机图像处理整个流水线工作中上游的核心工作了,比如我们拿到一副图片,首先需要进行预处理,这个预处理包括对图形的剪裁,旋转,平移,缩放,二值化等等简单的操作,下一步就是要进行特征检测了,这也是将一个图形从广义图片的范畴调整到数值化,数字化的开端,从这开始我们知道了人们是如何巧妙的将“图片”这种人类感性认知的东西映射到计算机的内存当中的,又是如何让计算机认识它的!

特征检测可以分为边缘特征检测角点特征检测斑点特征检测脊检测

边缘检测 [edg detection]

对于边缘检测,如果你上网搜索一下,首先查到的就是各种边缘检测算子,而这些算子无非就是一些$2\ast2$或者$3\ast3$的矩阵罢了。它们又是如何检测图像的边缘的呢?对于一个灰度图像而言,一张图片不过是灰度值从0~255构成的m*n的矩阵罢了。图像矩阵中的每个位置的像素值都是0~255之间的一个数,0就表示没有灰度,就是黑色;255就表示满级的灰度,就是白色。
而图片中的边缘是灰度值变化较为明显的地方,这些地方的值与前面的各种边缘滤波器——也就是对应的矩阵做卷积,就会得到高响应,从而判断出哪里是图像的边缘。
具体的各类边缘检测算子的区别,我们后续的文章里会继续讨论。但是,到这里,我感觉其实已经可以入门了。实际上检测边缘不是一个简单的问题,如果将边缘认为是一定数量点亮度发生变化的地方,那么边缘检测大体上就是计算这个亮度变化的导数。下图中这个例子,我们的数据是一行不同点亮度的数据。例如,在下面的1维数据中我们可以直观地说在第4与第5个点之间有一个边界:

边缘检测

除非场景中的物体非常简单并且照明条件得到了很好的控制,否则确定一个用来判断两个相邻点之间有多大的亮度变化才算是有边界的阈值,并不是一件容易的事。实际上,这也是为什么边缘检测不是一个简单问题的原因之一。

边缘检测的方法

有许多用于边缘检测的方法,他们大致可分为两类:基于搜索和基于零交叉

  1. 基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,用计算估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。
  2. 基于零交叉的方法找到由图像得到的二阶导数的零交叉点来定位边缘。
    滤波做为边缘检测的预处理通常是必要的,通常采用高斯滤波。
    像我们常见的边缘检测算子包括但不止于:
  • Roberts(这是最简单了算子)
  • Canny (目前最常用的)
  • Sobel
  • Isotropic Sobel
  • Prewitt
  • Laplacian
    等等一系列算子,都是用来做边缘检测的。

    角检测(兴趣点检测)[interest point detection]

    与边缘同样重要的一种特征就是角,也是角点,兴趣点;角点的检测经常用于三维建模以及物体识别中。两条边的交点形成一个角(点)。而图像的要点(也称为受关注点)是指图像中具有代表性以及健壮性的点。也就是说,要点可以是角(点),也可以不是,例如局部亮点或暗点,线段终点,或者曲线上的曲率最大值点。在实际应用中,很多所谓的(角)点检测算法其实是检测要点,而不仅仅是角(点)。所以,如果我们只想检测角的话,还需要对检测出的要点进一步分析。例如也可以先经过边检测,之后在做一些后处理来检测角。

    角,兴趣点检测方法

  1. $Moravec$ 角检测算法
    这是最早使用来做角检测的做法,他首先定义所谓的“角”就是那些自我相似程度低的点。这个算法检查所有图像中的像素,并考虑以该像素为中心点的一片范围,该范围与他周围覆盖最大的另一个范围的相似度做为参考,而相似度通常是将两个范围的对应点计算误差的平方和(SSD: Sum of Squared differences) ,越小代表相似度越高。
  2. $Harris\,\&\,Stephens/ Plessey / Shi-Tomasi$ 角检测算法
    $Harris\,\&\,Stephens$改善了$Moravec$的方法,他们直接考虑每个像素沿着特定方向处的像素的SSD,而不是使用与周围像素范围的SSD。详细内容可以查看之前的文章:
    Harris Corner Detection
  3. $Förstner$ 角检测
    在某些情况,会希望更精确地去计算角的位置,为了得到近似值,Förstner 算法可以解出闭集上的角附近范围中的所有切线与最接近这些切线的点,该算法依赖于在一个理想的角附近。
    这个算法感觉有些复杂目前还没有深入了解…
  4. 多尺度 $Harris$ 算子
    …这个就看不懂在讲什么了

    斑点检测

  • Laplacian of Gaussian (LoG)
  • 高斯差
  • Determinant of Hessian (DoH)
  • 最大稳定极值区域
  • PCBR

    脊检测

  • 霍夫变换
  • 广义霍夫变换

    特征描述

  • SIFT
  • SURF
  • GLOH
  • HOG
Donate comment here