OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB

姓名:张庆庆

学号:19021211151

嵌牛导读:计算机视觉领域(cv)主要目标是智能的处理图像,其中图像描述领域最关键的便是特征的提取以及更人性化的提取目标图片中人类所更关注的特点,学好特征提取就是为学好图像描述打好重要的基础。

 嵌牛鼻子:特征提取 图像描述

嵌牛提问:如何学好图像描述的重要基础

转载源:OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB - 简书

嵌牛正文:

有许多用于特征检测和提取的算法,我们将会对其中大部分进行介绍。OpenCV最常使用的特征检测和提取算法有:

Harris:该算法用于检测角点;

SIFT:该算法用于检测斑点;

SURF:该算法用于检测角点;

FAST:该算法用于检测角点;

BRIEF:该算法用于检测斑点;

ORB:该算法代表带方向的FAST算法与具有旋转不变性的BRIEF算法;

通过以下方法进行特征匹配:

暴力(Brute-Force)匹配法;

基于FLANN匹配法;

可以采用单应性进行空间验证。

特征提取算法比较

算法效果比较博文

计算速度:            ORB>>SURF>>SIFT(各差一个量级)

旋转鲁棒性:        SURF>ORB~SIFT(表示差不多)

模糊鲁棒性:        SURF>ORB~SIFT

尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)

基本概念

特征向量

用于表示和量化图像的数字列表,简单理解成将图片转化为一个数字列表表示。特征向量中用来描述图片的各种属性的向量称为特征矢量。

特征描述符(特征描述子)Descriptor

参考

是一种算法和方法,输入1个图像,返回多个特征向量(主要用来处理图像的局部,往往会把多个特征向量组成一个一维的向量)。主要用于图像匹配(视觉检测),匹配图像中的物品。

SIFT特征算法与DoG尺度空间

SIFT论文

原理

opencv官网解释

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

SIFT

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。

其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

尺度空间

对现实中物体的描述一定要在一个十分重要的前提下进行,这个前提就是对自然界建模时的尺度。当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体的尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的是图像的所有尺度下的描述。

DoG尺度空间

DoG空间极值点

特征点方向归一化

计算特征点描述子

SIFT算法分解为如下四步:

尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

sift=cv2.xfeatures2d.SIFT_create()'''

SIFT_create([, nfeatures[, nOctaveLayers[, contrastThreshold[, edgeThreshold[, sigma]]]]]) -> retval

    .  @param nfeatures The number of best features to retain. The features are ranked by their scores

    .  (measured in SIFT algorithm as the local contrast)

    . 

    .  @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The

    .  number of octaves is computed automatically from the image resolution.

    . 

    .  @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform

    .  (low-contrast) regions. The larger the threshold, the less features are produced by the detector.

    . 

    .  @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning

    .  is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are

    .  filtered out (more features are retained).

    . 

    .  @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image

    .  is captured with a weak camera with soft lenses, you might want to reduce the number.

'''keypoints,descriptor=sift.detectAndCompute(img_gray,None)'''

        detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) -> keypoints, descriptors

        .  Detects keypoints and computes the descriptors

        算法分成了两步,第一步特征提取,第二步计算描述符

''''''

keypoints数据结构

pt, 坐标

size, 特征直径

angle, 特征方向

response, 特征强度

octave,该特征在金字塔的第几层被找到

class_id

'''

KeyPoint数据结构解析

img=cv2.imread('laugh.jpg')img_large=cv2.imread('laugh_large.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray_large=cv2.cvtColor(img_large,cv2.COLOR_BGR2GRAY)sift=cv2.xfeatures2d.SIFT_create()keypoints,descriptor=sift.detectAndCompute(gray,None)keypoints2,descriptor2=sift.detectAndCompute(gray_large,None)img=cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,color=(0,0,255))img_large=cv2.drawKeypoints(image=img_large,outImage=img_large,keypoints=keypoints2,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,color=(0,0,255))cv2.imshow('sift',img)cv2.imshow('sift_large',img_large)

SIFT效果

SURF算法和Fast Hessian矩阵

SURF论文

原理

opencv官网解释

SURF是SIFT的加速版,它善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。在SIFT中使用DoG对LoG进行近似,而在SURF中使用盒子滤波器对LoG进行近似,这样就可以使用积分图像了(计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)。总之,SURF最大的特点在于采用了Haar特征以及积分图像的概念,大大加快了程序的运行效率。

surf=cv2.xfeatures2d.SURF_create(hessian_threshold)# hessian_threshold 保留的特征值越少,越强大的特征值才会被保留,需要根据具体图像进行调整

img=cv2.imread("laugh.jpg")gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)alg=cv2.xfeatures2d.SURF_create(10000)keypoints,descriptor=alg.detectAndCompute(gray,None)img=cv2.drawKeypoints(img,keypoints,img,(0,0,255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('hessian_10000',img)

SURF - hessan阈值效果对比

SURF - 不同尺度效果对比

注意事项

因为专利原因,OpenCV3.3开始不再免费开放SIFT\SURF,需要免费的请使用ORB算法

ORB特征算法

ORB算法综合了FAST角点检测算法和BRIEFF描述符。

FAST特征检测

算法原理

opencv官方文档

FAST只是一种特征点检测算法,并不涉及特征点的特征描述。

fast = cv2.FastFeatureDetector_create(threshold=10)

img=cv2.imread("laugh.jpg",0)fast=cv2.FastFeatureDetector_create()keypoints=fast.detect(img,None)img=cv2.drawKeypoints(img,keypoints,None,(0,0,255))

FAST - threshold100效果图

FAST - 默认threshold(10)效果图

BRIEF特征描述符

论文

opencv官方文档

中文版

Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。文章同样提到,在此之前,需要选取合适的gaussian kernel对图像做平滑处理。

缺点

1:不具备旋转不变性。

2:对噪声敏感

3:不具备尺度不变性。

img=cv2.imread("laugh.jpg",0)# Initiate FAST detectorstar=cv2.xfeatures2d.StarDetector_create()# Initiate BRIEF extractorbrief=cv2.xfeatures2d.BriefDescriptorExtractor_create()# find the keypoints with STARkp=star.detect(img,None)# compute the descriptors with BRIEFkp,des=brief.compute(img,kp)print(brief.descriptorSize())print(des.shape)

ORB

ORB论文

OpenCV官方文档

ORB采用了FAST作为特征点检测算子,特征点的主方向是通过矩(moment)计算而来解决了BRIEF不具备旋转不变性的问题。

ORB还做了这样的改进,不再使用pixel-pair,而是使用9×9的patch-pair,也就是说,对比patch的像素值之和,解决了BRIEF对噪声敏感的问题。

关于计算速度:

ORB是sift的100倍,是surf的10倍。

importcv2img=cv2.imread("A.jpg",0)orb=cv2.ORB_create()kp,des=orb.detectAndCompute(img,None)# len(kp) : 485# des.shape:  (485, 32)

ORB效果

附:相关知识

特征提取方法

直方图

对图片数据、特征分布的一种统计

对数据空间(bin)进行量化

聚类

Kmeans

颜色特征

量化颜色直方图,适用于均匀分布的颜色空间,如RGB,HSV等。

统计落在量化单元上的像素数量,bin内的像素由bin中心的颜色代表

聚类颜色直方图,适用于非均匀分布的颜色空间,如Lab等

几何特征

边缘:尺度问题->不同的标准差

捕捉到不同尺度的边缘

斑点 Blob:二阶高斯导数滤波LoG

LoG图找零点就是边缘

LoG图找极值点就是斑点

DoG:LoG近似于2个不同尺度的高斯差分,计算量大大减小

蓝色是LoG,黑色是DoG

关键点(keypoint):不同视角图片之间的映射,图片配准、拼接、运动跟踪、物体识别、机器人导航、3D重建

纹理特征

HOG方向梯度直方图

LBP局部二值模式

Gabor滤波器组:多尺度多方向。原理:频域中是加窗傅里叶变换,时域中是一个高斯核和正弦平面波的乘积

三尺度、八方向

局部特征

SIFT\SURF

嵌牛总结:特征提取是图像描述的关键,如何做到更智能化的目标提取,关系到图像描述的质量及精确程度。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容