图像的特性,一般是指图像所表达出的该图像的特有属性,实在就是事物的图像特性,由于图像得到的多样性(拍摄器材、角度等),事物的图像特性有时并不特殊突出或与无关物体混杂在一起,因此图像的特性获取需要接纳特定的方法。
本文主要形貌了图像特性提取的几种常用方法,并阐明白其在opencv中的应用。
一.概述
图像的特性,分整体特性和局部特性,顾名思义,整体特性是将整个图像作为一个研究对象,而局部特性,是将整个图像分别为子区域,以子区域作为一个研究对象。历史上,图像的特性的提取是从整体特性开始的,但很快出现了困难:首先是背景的干扰,然后是事物在图像中的各种“形变”。于是研究的重点就转移到局部特性的提取上。
图像的局部特性,往往处于图像厘革比力大的区域,比方边缘、角、脊等,因为这些区域所含有的信息,比一块色彩无厘革的区域要多。常用的特性包罗:灰度、直方图、梯度、边缘、纹理、矩等等,因此局部特性提取主要分为:基于灰度的算法、基于分布统计的算法和基于表面的算法,它们各有特点。
图像的特性包罗了事物图像表述的大部门信息,有些特性纵然进行某些利用,它们仍然稳定地存在。这里的图像的利用包罗几何厘革和光度厘革。几何厘革就是平移,旋转,缩放等,光度厘革就是亮度,色度等厘革。局部特性一般都能做到平移无关。要做到旋转无关,则需要将窗口以某个主方向对齐后再提取局部特性。如果对图像进行归一化(最大最小值归一化、均值方差归一化、直方图均衡化等)处理,能在肯定水平上做到对亮度或光照无关。接纳合适的方法,找出并提取这些特性,就相当于确定了事物的图像。
图像特性提取,一般可以用来做聚类、匹配、识别、拼接等工作
特性提取实在包罗特性检测与特性形貌两方面内容,一般情况下,先检测、判断特性点,然后对特性点进行相似性度量,但大部门检测方法都形成了特定的绑定,即在判断特性点的同时生成特定的形貌符,以致二者酿成了同一个过程。特性提取和匹配包罗三部门内容:
- 1、检测(detection):识别特性(关键)点
- 2、形貌(description): 形貌每个特性点周围的特性,理想情况下,这种形貌在光照、平移、旋转等厘革下是稳定的。通常对特性点的形貌接纳的是一个形貌符向量。
- 3、匹配(matching): 通过比力图像中的特性形貌符来识别相似的特性。比力的方法和判断的阈值是关键。
下面是一些经典关键点的检测方法。
- HARRIS- 1988 Harris Corner Detector (Harris, Stephens)
- Shi, Tomasi- 1996 Good Features to Track (Shi, Tomasi)
- SIFT- 1999 Scale Invariant Feature Transform (Lowe)
- SURT- 2006 Speeded Up Robust Features (Bay, Tuytelaars, Van Gool) -None free
二.Harris角点检测
图像中的边缘,角,脊等一般都是图像的特性(关键)点,先给出它们的特性:
- 边缘:是组成图像两个区域之间界限(或边缘)的像素。一般是图像中拥有大梯度(颜色或灰度厘革率大)的点组成的子集。
- 角 :在局部有两维结构,一般是图像梯度中高度曲率的点(方向忽然发生厘革的边缘)。
- 脊 :长条形的物体被称为脊,可以被看作是代表对称轴的一维曲线,对于每个脊有一个脊宽度。在空中摄影中往往利用脊检测来分辨蹊径,在医学图像中它被用来分辨血管。
这里以Harris方法阐明角点的检测。算法基本思想是利用一个固定窗口在图像上进行任意方向上的滑动,比力滑动前与滑动后两种情况,窗口中的像素厘革水平,如果存在任意方向上的滑动,都有着较大厘革,那么可以以为该窗口中存在角点。这个过程的形象阐明如下图:
蓝色窗口朝各方向移动后,窗口内像素值没有厘革;玄色窗口如果如果沿着垂直方向移动,像素值会发生改变,如果沿着水平移动,像素值不会发生厘革;赤色窗口不管朝哪个方向移动,像素值都会发生很大厘革。从这里也可以看出,角点特性是图像中较好的特性,比边缘特性更好地用于定位。
Harris 角点检测具有旋转稳定性,但不具有标准稳定性,也就是说标准厘革大概会导致角点变为边缘(比方小圆角可被以为是角点,而大圆角大概被以为是边缘)。
Opencv中提供了cornerHarris函数,它的声明如下:- void cv::cornerHarris (InputArray src,
- OutputArray dst,
- int blockSize,
- int ksize,
- double k,
- int borderType = BORDER_DEFAULT
- )
复制代码 Harris根据图像的灰度进行检测,所以src为灰度图像,dst为窗口的厘革响应值(该值的意义参见官网的“Harris Corner Detection”条目),它与原图像巨细类似(每像素一个值),通过该值,可将这个窗口所在的区域分别为平面、边缘或角点,角点时,该值比力大,因而可以为该值大于某阈值时,此窗口内包罗角点。blockSize是检测窗口的巨细,ksize体现计算梯度时Sobel()算子的巨细,k是计算dst用到的一个参数,borderType是图像像素的界限模式,一般blocksize取2,ksize取3,k取0.04。
该函数的应用比力简朴,就是判断dst[i,j]是否大于阈值,该阈值与具体的图像有关,比方官网的一个示例中,取dst中最大值的0.01。
三.HOG
HOG( histogram of oriented gradients)的意思是方向梯度直方图,由 Navneet Dalal 和 Bill Triggs 于 2005 年首次引入的,它实际上是以统计的角度来表达某一区域内像素值厘革的巨细和方向。
HOG有以下特点:
- HOG体现的是边缘(梯度)的结构特性,因此可以形貌局部的形状信息;
- 位置和方向空间的量化肯定水平上可以抑制平移和旋转带来的影响;
- 如果接纳局部区域归一化直方图,可以部门抵消光照厘革带来的影响;
HOG特性是通过计算各小区域的特性集合而成,这里先需要阐明一下HOG中的区域分别的概念:block(块),cell(胞元),win(窗口),它们会在HOG计算过程中出现。block包罗cell(一般要求blokc巨细是整数倍数的cell巨细),比方cell可取8*8的像素,每个block可取2*2个cell,那么block的巨细应该是16*16。win就是要计算特性的图像窗口,在win中,接纳滑动block的方法得到各block,滑动时,由滑动步长控制每滑动一次的间隔。win, block, cell滑动步长之间的关系如下图所示。
上图中,cell的巨细为2*2,block的巨细为4*6(包罗2*3个cell),win的巨细为10*10,虚线框体现初始block横向和纵向分别滑动了一步,此时滑动步长为2和1。理想情况下,如果block巨细恰好能“套住”图像的特性,当然最好,但实际不是这样,因此各block之间应有肯定的重叠,block和滑动步长的巨细也要合适。对上面的情况,横向可以有(窗口长-cell长)/步长+1个block(要求整除),纵向同理,即总共有[(10-4)/2+1]* [(10-6)/1+1]=20个block。
HOG相对于别的算法是比力简朴的,步骤如下:
- 图像预处理:包罗巨细,灰度化,抑噪等,主要是为了进步图像特性形貌对光照及环境厘革的鲁棒性,低落图像局部的阴影、局部曝光过多及纹理失真,尽大概抑制噪声干扰。
- 对待计算的图像设置win,block等,先计算每个像素的图像梯度和方向,再在cell内进行统计(按角度分别多少个统计区间),形成直方图。这种直方图包罗了局部图像方向厘革的和强度的信息,在block范围内进行归一化,接纳归一化后,可以消除整体亮度厘革带来的影响。
- 将win内所有的block向量合起来,就是整个win的特性。
这里可以看出,HOG中的直方图是对cell而言的,无论cell的巨细,每个cell都有固定个值(下标维度隐含了角度,这个固定值一般为9,即将180度分成9个统计区间,大于180度梯度以为是负值),但特性向量是对block而言的,即如果一个block含有4个cell,特性值就是一个36维的向量,如果一个窗口有20个block,则特性值就是一个36*20=720维的向量。
关于block向量的归一化,原论文中提到4种方法:一是接纳L2范数;二是接纳L2范数,然后限定分量的最大值(为0.2),再次归一化,这种方法就是L2-Hys;三是L1范数;四是L1范数,然后取平方根。具体形貌可见Navneet Dalal 和 Bill Triggs的论文(https://hal.inria.fr/inria-00548512/document/)。
Opencv中提供了HOGDescriptor类,HOGDescriptor类不但提供了计算HOG特性的方法,也提供了在图像中判断是否具有某特性的方法(即物体检测)。利用HOGDescriptor的流程大致上是:构造,compute计算特性,detect检测物体(如果需要)。
构造HOGDescriptor的声明如下:- cv::HOGDescriptor::HOGDescriptor(Size _winSize,
- Size _blockSize,
- Size _blockStride,
- Size _cellSize,
- int _nbins,
- int _derivAperture = 1,
- double _winSigma = -1,
- HOGDescriptor::HistogramNormType _histogramNormType = HOGDescriptor::L2Hys,
- double _L2HysThreshold = 0.2,
- bool _gammaCorrection = false,
- int _nlevels = HOGDescriptor::DEFAULT_NLEVELS,
- bool _signedGradient = false
- )
复制代码 _winSize:要计算的图像窗口巨细
_blockSize:block巨细
_blockStride:滑动步长
_cellSize:cell巨细
_nbins:每个cell按角度分别的区间,一般为9,即20度一个统计区间
_derivAperture:未知
_winSigma:在计算前可以利用高斯函数进行平滑,低落噪点的影响,高斯函数的σ
_histogramNormType:直方图的归一化的方法,就是L2-Hys
_L2HysThreshold:L2-Hys方法中的最大分量值
_gammaCorrection:是否进行gamma校正
_nlevels:用于不同图像尺寸(缩小)时进行检测,最大的层数,只计算特性时没有利用
_signedGradient: 计算的梯度是否有正负,如果不区分互为反方向的两个梯度(履历表明,在行人检测中,无符号梯度优于有符号梯度),把它们都当作正数,则接纳无符号梯度,否则接纳有符号梯度。
计算HOG特性的的声明如下:- void cv::HOGDescriptor::compute ( InputArray img,
- std::vector< float > & descriptors,
- Size winStride = Size(),
- Size padding = Size(),
- const std::vector< Point > & locations = std::vector< Point >()
- )
复制代码 Img:输入的灰度图像
descriptors:输出的HOG特性向量
winStride :检测窗口的滑动步长
padding:窗口添补巨细,对物体处于界限时,检测比力有效。
locations :检测到物体时的左上角坐标(巨细是winSize)
检测物体时,HOGDescriptor提供了detect和detectMultiScale方法,在setSVMDetector之后,就可以调用它们,实在应该是调用训练好的SVM进行分类,由于HOG对样本图像的巨细比力敏感的,所以需要对待检测的图像进行多尺寸(缩放)检测,MultiScale就是这个意思,当然,待检测图像中大概不止一次出现样本的图像,检测的效果是一个数组而非一个数。这里不再形貌HOGDescriptor自己具有的检测方法。
四.ORB
ORB(Oriented FAST and Rotated BRIEF) 是一种快速特性点提取和形貌的算法,它作为一种替换SIFT,SURF方法而被提出的(2011年),它接纳改进的FAST关键点检测方法,使其具有方向性,并接纳具有旋转稳定性的BRIEF特性形貌子,并在它们原来的底子上做了改进与优化,FAST和BRIEF都是比力快速的特性计算方法,因此ORB具有非同一般的性能上风,算法实时性在移动端设备上有很好的应用。
ORB是FAST特性点的检测方法与BRIEF特性形貌法的融合。
FAST也是检测图像中的角点,总的思路是:若某像素与其周围邻域内足够多的像素点相差较大,则该像素大概是角点(当然,FAST含有一些快速判断以及去除“伪”角点的子方法,以进步快速和准确性)。Opencv中提供了FAST函数,可以得到角点集合。
BRIEF于2010年提出,它是在每一个特性点的邻域内,选取n个点对,比如其中一个点对为p、q,比力它们像素的巨细关系:如果p比q小,取1;反之取0,即其形貌向量由n个0和1组成(二进制串)。关于p、q如何选取和选取的个数,算法提出者均有叙述,如p、q可按均匀采样、随机采样、高斯分布采样等,其个数可取128,256和512。BRIEF创建速率比力快,同时也极大的低落了特性匹配的时间,但其缺点是对噪声敏感(因为二进制编码是通过比力具体像素值来判定的)以及不具备旋转稳定性和标准稳定性。BRIEF在opencv的焦点模块中未被支持,而是在扩展模块中xfeatures2d中被支持。
ORB对FAST的改进包罗:
- 通过对原始图像的缩放,形成一系列图像(图像“金字塔”),为每张图像运用FAST。
- 在每个特性点,计算邻域内像素强度(“亮度”)的“质心”,“质心”与特性点的连线方向构成此特性点的方向。
步调1可以使算法具有肯定的标准稳定性,步调2是为旋转稳定性做准备的。
ORB对BRIEF的改进包罗:
- 以小的区域块像素的均匀值代替一个像素的值(上文中的p或q)
- 选取点后(上文中的p或q)绕特性点的方向(FAST的改进)旋转,由此,选取点关于特性点方向的相对位置是稳定的,但关于特性点邻域的位置却变了。
- 如何选取(p,q)点对,没接纳BRIEF中的5中方法,而接纳所谓“rBRIEF”的方法,即统计查找所有(p,g)的选取方法中,相关性最小的多少组点对作为最终的(p,g)点对。
步调1可以增长抗干扰性,步调2可以增长旋转稳定性,步调3使形貌符只管表达特性点的独特性,如果不同特性点的形貌符的可区分性比力差,匹配时不容易找到对应的匹配点,引起误匹配。
Opencv中提供了ORB类,利用ORB的流程大致上是:构建(create函数)-> 检测,找出关键点集(detect函数)-> 对关键点进行计算,形成图像的特性形貌符集(compute函数),后两步也可以合成一步(detectAndCompute函数),最后得到的是特性点的位置和特性点形貌符向量。其中第一步设置ORB的参数是关键,ORB类构造的方法如下:- static Ptr<ORB> cv::ORB::create( int nfeatures = 500,
- float scaleFactor = 1.2f,
- int nlevels = 8,
- int edgeThreshold = 31,
- int firstLevel = 0,
- int WTA_K = 2,
- ORB::ScoreType scoreType = ORB::HARRIS_SCORE,
- int patchSize = 31,
- int fastThreshold = 20
- )
复制代码 nfeatures:最多保留的特性点的数量;
scaleFactor:金字塔图像的标准缩放参数,上一层图像的尺寸是下一层的(1/s)*(1/s)
nlevels:金字塔的层数;
edgeThreshold:边缘巨细,靠近边缘edgeThreshold以内的像素是不检测特性点的,它大致与patchSize相等或大于patchSize。
firstLevel:将原始图像放在金字塔的第几层,即该层的上层或下层,被缩小或放大。
WET_K:用于产生BIREF形貌符的点对的个数。
scoreType:利用FAST机制或者Harris corner机制来过滤特性点。
patchSize:用于计算BIREF形貌符的特性点邻域巨细。
fastThreshold:FAST算法提取特性点的阈值
五.SIFT
SIFT(Scale Invariant Feature Transform,标准稳定特性变更)是由加拿大教授David G.Lowe提出的,并申请了专利,该专利已在2020年到期。
历史上,SIFT特性和SURF特性都好坏常常用的特性,SIFT特性以准确著称,但计算量大,无法在CPU上实时计算。SURF算法步骤与SIFT算法大致类似,但接纳的方法不一样,低落了SIFT的准确度,但进步了性能,而ORB则适合于实时利用。在opencv中,SURF在扩展模块xfeatures2d中被支持。SIFT特性对旋转、标准缩放、亮度厘革等保持稳定性,是一种非常稳定的局部特性。
为理解SIFT,需要引入“标准空间”的概念。标准空间,是在信号长度稳定的情况下,通过(高斯)平滑,得到信号在不同标准下的表达,然后利用标准对应巨细的窗口进行观测和提取特性。因为得到了原始信号在所有标准下的特性,这些特性在整体上做到了标准无关——因为原始信号各种标准的特性都有了。
对二维图像,标准空间就是将图像的点I(x,y),颠末不同σ作为参数的高斯核函数作用,而形成的一组图像,即
L(x,y, σ)=G(x,y, σ)*I(x,y),
上式中,L(x,y, σ)是标准空间中某一σ标准下在(x,y)点的像素值,I(x,y)为原始图像的在(x,y)的像素值,G(x,y, σ)为高斯核函数:
这样,以原始图像为最底层,按σ递增的顺序计算得到的一组L,此时按σ排列所形成的序列就是该图像的标准空间表达,称为高斯金字塔(实际做法略有不同)。
从上面的公式,可以看出某点的最终像素值,是该点的像素值和周边像素值的加权均匀值,权值就是高斯核函数,间隔这点越远的像素值的权值越小,图像颠末高斯核函数处理后,随着σ的增大,图像越模糊,相当于对图像做了低通滤波。
通常情况下,图像中物体的局部特性提取只有在肯定的图像标准下进行才有意义(比方在上面Harris角点检测中提到的某一尺寸下可以以为是角点,在放大后未必是角点),这个标准称之为特性标准。
为什么需要创建高斯金字塔?一般来讲,在没有先验知识的情况下,对两幅图像分别在每个标准上检测关键点并提取特性,总有某些关键点及其特性恰好来自类似的标准,如果它们恰好可以匹配上,则图像1和图像2匹配,反之,如果所有关键点都配不上,则图像1和图像2不匹配。因此图像金字塔,是在保持观测窗口稳定的情况下,得到输入图像在不同尺寸(分辨率)下的表达,在不同尺寸上提取到的特性在整体上做到了尺寸(分辨率)无关。
总结一下SIFT接纳的步调,来实现旋转、标准缩放、亮度厘革等保持稳定性的:
缩放:接纳标准空间,包罗了所有的标准下的特性
旋转:计算区域内的图像梯度方向,以主方向作为标准
亮度:特性向量有归一化,有肯定的亮度厘革无关性
SIFT算法可分为四步:
- 高斯(差分)金字塔(Difference of Gaussian, DOG)空间创建:为形成搜索不同标准上的图像位置。通过高斯微分函数来识别潜伏的对于标准和旋转稳定的爱好点。
- σ是高斯正态分布的标准差,它可以控制邻域的巨细,大致上3σ间隔之外的像素都可以忽略其影响,因此邻域巨细一般为(6σ+1)*(6σ+1),比方对5*5的邻域,σ=0.6。
- 如果m是高斯金字塔每组内的层数,则差分后层数变为m-1,可计算极值的层数为(m-1)-2,实际计算时(m-3)在3到5之间。
- 高斯金字塔的总组数n,最下层组一般扩采一次,然后是原图层组,再是降采层组,一般最小图像不小于16*16
- 标准空间极值检测,特性点定位:找到每层属性的相对极值点,可作为候选的特性点,留意它是离散空间的极值点,接纳Taylor插值,拟合到连续空间,去除低对比度的点,再去除不稳定的边缘响应点。
- 特性点方向计算:在特性点邻域完成像素梯度计算,利用直方图统计邻域内的梯度和方向,并分配到8个方向上,数量最多的是主方向。
- 特性点形貌向量生成:对每个特性点,将坐标旋转到它的主方向,在邻域内计算像素梯度,Lowe建议在特性点周围4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征特性。
以上仅是对SIFT算法的简要阐明,它确实比力复杂,详细的形貌可参阅相关网上文章。
Opencv中提供了SIFT类(opencv早期版本放在contrib下,v4.4引入到features2d中),利用SIFT的流程与ORB是一样的(实在它们都继续类似的基类)。创建SIFT类的声明如下:- static Ptr<SIFT> cv::SIFT::create (int nfeatures,
- int nOctaveLayers,
- double contrastThreshold,
- double edgeThreshold,
- double sigma,
- int descriptorType
- )
复制代码 nfeatures:保留的最佳特性的数量(候选的特性点是有先后顺序的)。
nOctavelLayers:每组中图像的层数,组数可由图像的分辨率主动计算;
constrastThreshold:对比度阈值,在Taylor拟合后,对绝对值(DOG的差分值)过小的极值点,由于其稳定性较差应予以舍。对于[0,1]范围内的像素,Lowe建议该值取0.03。显然,阈值越大,产生的特性越少。在opencv中,真正应用的阈值是constrastThreshold/ nOctavelLayers。
edgeThreshold:用于过滤掉边缘响应的阈值。edgeThreshold越大,产生的特性越多;
sigma:σ,如果图像分辨率较低,则大概需要减少数值。
descriptorType:形貌符数据结构,float或unsigned char
网上有文章对比了一下ORB,SURF,SIFT三个算法,建议在应用中,对时间有要求的,选用ORB,否则选用SURF。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|