精华内容
下载资源
问答
  • 为克服方向梯度直方图(HOG)特征在人体行为识别中仅表征动作的全局梯度特征、缺乏局部细节信息、对遮挡表现不佳的问题,改进了一种基于全局特征和局部特征的方法来实现人体行为识别。该算法首先使用背景减法获得人体...
  • 计算机视觉项目实战(二)、局部特征匹配Local_Feature_Matching配套素材资源和代码,项目详解见本人博客https://blog.csdn.net/Accelerato/article/details/105577679
  • 总体来说,图像特征可以包括颜色特征、纹理特等、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰,本篇文章也是对这方面知识的一个总结。本篇文章现在(2015/1/30)只是以初稿的...
  • 基于SIFT算法的局部特征点人脸识别图像处理技术.pdf
  • 在采用图像谱残差分析方法获取全局特征显著性图像的基础上, 利用小波变换在时域和频域具有的局部特征信息表征能力, 通过对图像包含的不同特征信息进行小波变换, 去除各个特征图中的冗余信息, 得到图像局部特征显著...
  • 文档,主讲了基于全局和局部特征融合的图像匹配算法研究
  • 传统的基于局部特征的图像目标检测算法具有对遮挡和旋转敏感、检测精度不高以及运算速度慢的特点,为了改进该算法的性能,提出了一种将图像局部特征应用于稀疏表示理论的图像目标检测算法。该算法利用随机树的方式有...
  • 最后,分别统计各墨卡托平面的分布直方图,得到特征点的局部特征描述子。HMec特征描述子能很好地保留点云的局部几何结构特征,从而提高特征描述子的辨别力。在Bologna和3DMatch数据集上的测试结果表明,相比其他9种局部...
  • 带有有限注解的医学图像分割的全局和局部特征的对比学习 该代码适用于“带有有限注解的医学图像分割的全局和局部特征的对比学习”一文,在NeurIPS 2020(第34届国际神经信息处理系统国际会议)上作为口头报告被接受...
  • 局部特征尺度分解一种信号处理方法,LCD通过三次样条插值获得光滑的内禀尺度分量(Intrinsic scale component,简称ISC),从本质上解决了ITD分解结果出现毛刺的现象。
  • 摘要: 基于局部特征的图像目标识别是近年来计算机视觉领域中的热点问题。首先,论述整体特征的不足以及局 部特征的优势。然后,详细阐述局部特征提取技术和目标表示方法的研究现状,讨论其中的一些常用算法。为清 ...
  • 针对传统人脸表情识别(FER)方法所提取的表情特征较为单一,同时对于表情分类器的选择存在局限性的问题,提出一种融合局部特征与深度置信网络(DBN)的FER方法。该方法首先从人脸表情图像中切割出眉毛眼睛部位与嘴巴部位...
  • 局部特征检测子--ppt

    2019-11-25 02:11:50
    关于局部特征检测子的相关内容描述,设计SIFT/SURF 关于局部特征检测子的相关内容描述,设计SIFT/SURF
  • 基于局部特征和整体特征融合的面部表情识别 [日期:2005-7-18] 来源:电子技术应用 作者:刘 松 应自炉 李繁荣 [字体:大 中 小]    摘要:提出融合局部特征和整体特片的方法实现人脸面部表现特征的...
  • 应用图像局部特征和全局特征对比的显著性检测模型
  • 基于多核学习的GIST全局和SIFT局部特征融合遥感图像检索方法.pdf
  • 基于局部特征提取的人脸识别算法研究.pdf
  • 推荐国防科技大学郭裕兰博士的《点云局部特征描述与三维目标重建识别技术研究》,将特征描述的本质说出来了: 一个良好的特征描述子应能包含所在局部表面的主要形状信息以提供足量的 鉴别力。此外,一个良好的特征...
  • 提出了一种基于局部特征描述的多模态视网膜图像配准方法,该方法采用圆环结构划分关键点周围区域,通过局部梯度方向直方图构造特征描述子,并对所提取的特征向量进行规范化。实验证明,该算法在多模态视网膜数据集上...
  • 点云局部特征描述与匹配研究_杨佳琪.pdf
  • 基于局部特征的表情不变3维人脸识别算法.pdf
  • 针对人脸识别算法缺乏对光照变化的自动调节能力的弱点,提出了一种综合利用全局和局部特征进行人脸识别的新方法。对整幅人脸图像进行主成分分析;针对人脸局部特征,提出一种根据各局部子块包含的信息量即利用图像熵...
  • 结合深度学习和全局-局部特征的图像显著区域计算.pdf
  • 图像局部特征提取

    千次阅读 2019-10-02 20:33:42
    图像特征可以包括颜色特征、纹理特征、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰。图像特征提取是图像分析与图像识别的前提,它是将高维的图像数据进行简化表达最有效的方式...

    图像特征可以包括颜色特征、纹理特征、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰。图像特征提取是图像分析与图像识别的前提,它是将高维的图像数据进行简化表达最有效的方式,从一幅图像的的数据矩阵中,我们看不出任何信息,所以我们必须根据这些数据提取出图像中的关键信息,一些基本元件以及它们的关系。

    图像局部特征描述的核心问题是不变性(鲁棒性)和可区分性。由于使用局部图像特征描述子的时候,通常是为了鲁棒地处理各种图像变换的情况。因此,在构建/设计特征描述子的时候,不变性问题就是首先需要考虑的问题。在宽基线匹配中,需要考虑特征描述子对于视角变化的不变性、对尺度变化的不变性、对旋转变化的不变性等;在形状识别和物体检索中,需要考虑特征描述子对形状的不变性。

    局部特征点是图像特征的局部表达,它只能反应图像上具有的局部特殊性,所以它只适合于对图像进行匹配,检索等应用。对于图像理解则不太适合。而后者更关心一些全局特征,如颜色分布,纹理特征,主要物体的形状等。全局特征容易受到环境的干扰,光照,旋转,噪声等不利因素都会影响全局特征。相比而言,局部特征点,往往对应着图像中的一些线条交叉,明暗变化的结构中,受到的干扰也少。

    对于局部特征的检测,通常使用局部图像描述子来进行。

    斑点角点是两类局部特征点。斑点通常是指与周围有着颜色和灰度差别的区域,如草原上的一棵树或一栋房子。它是一个区域,所以它比角点的抗噪能力要强,稳定性要好。而角点则是图像中物体的拐角或者线条之间的交叉部分。

    斑点检测原理与举例

    LoG与DoH

    斑点检测的方法主要包括利用高斯拉普拉斯算子检测的方法(LOG),以及利用像素点Hessian矩阵(二阶微分)及其行列式值的方法(DOH)。

    DoH方法就是利用图像点二阶微分Hessian矩阵, Hessian矩阵行列式的值,同样也反映了图像局部的结构信息。与LoG相比,DoH对图像中的细长结构的斑点有较好的抑制作用。

    无论是LoG还是DoH,它们对图像中的斑点进行检测,其步骤都可以分为以下两步:

    1. 使用不同的生成或模板,并对图像进行卷积运算;
    2. 在图像的位置空间与尺度空间中搜索LoG与DoH响应的峰值。

    SIFT(尺度不变特征变换)

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

    SIFT算法详细介绍

    SIFT算法步骤

    1. 构建DOG尺度空间

      模拟图像数据的多尺度特征,大尺度抓住概貌特征,小尺度注重细节特征。通过构建高斯金字塔(每一层用不同的参数\(\sigma\)做高斯模糊(加权)),保证图像在任何尺度都能有对应的特征点,即保证尺度不变性

    2. 关键点搜索和定位:

      确定是否为关键点,需要将该点与同尺度空间不同\(\sigma\)值的图像中的相邻点比较,如果该点为max或min,则为一个特征点。找到所有特征点后,要去除低对比度和不稳定的边缘效应的点,留下具有代表性的关键点(比如,正方形旋转后变为菱形,如果用边缘做识别,4条边就完全不一样,就会错误;如果用角点识别,则稳定一些)。去除这些点的好处是增强匹配的抗噪能力和稳定性。最后,对离散的点做曲线拟合,得到精确的关键点的位置和尺度信息。

    3. 方向赋值

      为了实现旋转不变性,需要根据检测到的关键点的局部图像结构为特征点赋值。具体做法是用梯度方向直方图。在计算直方图时,每个加入直方图的采样点都使用圆形高斯函数进行加权处理,也就是进行高斯平滑。这主要是因为SIFT算法只考虑了尺度和旋转不变形,没有考虑仿射不变性。通过高斯平滑,可以使关键点附近的梯度幅值有较大权重,从而部分弥补没考虑仿射不变形产生的特征点不稳定。注意,一个关键点可能具有多个关键方向,这有利于增强图像匹配的鲁棒性

    4. 关键点描述子生成

      关键点描述子不但包括关键点,还包括关键点周围对其有贡献的像素点。这样可使关键点有更多的不变特性,提高目标匹配效率。在描述子采样区域时,需要考虑旋转后进行双线性插值,防止因旋转图像出现白点。同时,为了保证旋转不变性,要以特征点为中心,在附近领域内旋转\(\theta\)角,然后计算采样区域的梯度直方图,形成n维SIFT特征矢量(如128-SIFT)。最后,为了去除光照变化的影响,需要对特征矢量进行归一化处理。

    SIFT特征提取的优点

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

    SIFT特征提取的缺点

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

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

    目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

    1. 目标的旋转、缩放、平移(RST)
    2. 图像仿射/投影变换(视点viewpoint)
    3. 光照影响(illumination)
    4. 目标遮挡(occlusion)
    5. 杂物场景(clutter)
    6. 噪声

    角点检测的原理与举例

    角点检测的方法也是极多的,其中具有代表性的算法是Harris算法与FAST算法。
    算法原理详解:Harris特征点检测FAST特征检测

    Harris角点特征提取

    Harris角点检测是一种基于图像灰度的一阶导数矩阵检测方法。检测器的主要思想是局部自相似性/自相关性,即在某个局部窗口内图像块与在各个方向微小移动后的窗口内图像块的相似性。该算法认为像素周围显示存在多余一个方向的边,便认为该点为兴趣点,即称为角点。

    Harris算法步骤

    1. 利用水平、竖直差分算子对图像每个像素进行滤波以求得\(I_x, I_y\),进而求得图像域中点\(x\)上的对称半正定矩阵\(M_I = M_I(x)\)
      \[ M_I=\nabla I \nabla I^T=\left[ \begin{array}{c} I_x \\ I_y \end{array} \right] \left[ \begin{array}{c} I_x & I_y \end{array}\right] = \left[ \begin{array}{cc} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{array} \right] \]
    2. 选择权重矩阵\(W\)(通常为高斯滤波器\(G\))对\(M\)进行滤波
      \[ W = exp(- \frac{x^2+y^2}{2\sigma^2}) \]
      \[ M_I = W * M_I \]
    3. 利用\(M\)计算对应于每个像素的角点量\(cim\)\(R\):
      \[ cim = \frac{I_x^2*I_y^2-(I_xI_y)^2}{I_x^2+I_y^2} \]
    4. 在矩阵 \(cim\) 中,同时满足 \(cim\) 大于一阙值 \(thresh\)\(cim\) 是某领域内的局部极大值,这两个条件的点被认为是角点。

      提高阙值,则提取的角点数目变少,降低阙值,则提取的角点数目变多
      另外求局部极大值的领域大小也会影响提取角点的数目和容忍度

    Harris角点性质

    1. 该算法算子对亮度和对比度的变化不敏感。

      这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。

    2. 算子具有旋转不变性。

      Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值也不发生变化,由此说明Harris角点检测算子具有旋转不变性。

    3. 算子不具有尺度不变性。

    Harris算法实现

    import numpy as np
    import matplotlib.pyplot as plt
    from PIL import Image
    from scipy.ndimage import filters
    
    
    class Harris:
        def __init__(self, img_path):
            self.img_path = img_path
            self.grayImg = None
            self.Ix = None
            self.Iy = None
            self.Ix_mul_Ix = None
            self.Ix_mul_Iy = None
            self.Iy_mul_Iy = None
            self.cim = None
            self.filtered_coords = None
    
        def _rgb2gray(self):
            self.grayImg = Image.open(self.img_path).convert('L')
            self.grayImg = np.array(self.grayImg)
    
        def _cal_ix_iy(self, sigma=3):
            # 计算导数
            self.Ix = np.zeros(self.grayImg.shape)
            filters.gaussian_filter(self.grayImg, (sigma, sigma), (0, 1), self.Ix)
            self.Iy = np.zeros(self.grayImg.shape)
            filters.gaussian_filter(self.grayImg, (sigma, sigma), (1, 0), self.Iy)
    
        def _cal_para(self):
            # 计算Ix^2,Iy^2和Ix*Iy并加入高斯滤波
            self.Ix_mul_Ix = filters.gaussian_filter(self.Ix*self.Ix, 3)
            self.Iy_mul_Iy = filters.gaussian_filter(self.Iy*self.Iy, 3)
            self.Ix_mul_Iy = filters.gaussian_filter(self.Ix*self.Iy, 3)
    
        def _cal_cim(self):
            self.cim = (self.Ix_mul_Ix*self.Iy_mul_Iy - 2*self.Ix_mul_Iy) / (self.Ix_mul_Ix + self.Iy_mul_Iy)
    
        def cal_harris(self, min_dist=10, threshold=0.1):
            self._rgb2gray()
            self._cal_ix_iy()
            self._cal_para()
            self._cal_cim()
            conner_threshold = self.cim.max()*threshold
            self.cim = (self.cim > conner_threshold) * 1
            coords = np.array(self.cim.nonzero()).T
            candidate_values = [self.cim[c[0], c[1]] for c in coords]
            index = np.argsort(candidate_values)
            allowed_locations = np.zeros(self.cim.shape)
            allowed_locations[min_dist:-min_dist, min_dist:-min_dist] = 1
            self.filtered_coords = []
            for i in index:
                if allowed_locations[coords[i, 0], coords[i, 1]] == 1:
                    self.filtered_coords.append(coords[i])
                    allowed_locations[(coords[i, 0] - min_dist):(coords[i, 0] + min_dist),
                    (coords[i, 1] - min_dist):(coords[i, 1] + min_dist)] = 0  # 此处保证min_dist*min_dist只有一个harris特征点
            return self.filtered_coords
    
        def plot_harris_point(self):
            plt.figure()
            plt.gray()
            plt.imshow(Image.open(self.img_path).convert('L'))
            plt.plot([p[1] for p in self.filtered_coords], [p[0] for p in self.filtered_coords], '*')
            plt.axis('off')
            plt.show()
    
    
    if __name__ == '__main__':
        img_path = "./imgs/3.jpg"
        harris = Harris(img_path)
        harris.cal_harris()
        harris.plot_harris_point()

    结果演示

    1503464-20190928163811051-679064479.jpg

    参考文献

    python计算机视觉编程第2章
    图像处理之特征提取
    python计算机视觉编程之局部图像描述子
    图像局部特征点检测算法综述
    斑点检测
    SIFT定位算法关键步骤的说明
    SIFT算法详解
    sift特征提取算法
    Harris特征点检测
    FAST特征检测
    特征点提取之Harris角点提取法
    Harris角点检测(一)

    转载于:https://www.cnblogs.com/zhhfan/p/11603669.html

    展开全文
  • 图像处理特征提取之局部特征

    千次阅读 2019-06-19 21:01:41
    HOG特征 https://blog.csdn.net/coming_is_winter/article/details/72850511 https://blog.csdn.net/zouxy09/article/details/7929348/ 总结:Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元...

    LOG,HOG,DOG微分算子在近圆的斑点检测方面效果很好

    HOG特征

    https://blog.csdn.net/coming_is_winter/article/details/72850511
    https://blog.csdn.net/zouxy09/article/details/7929348/

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

    LOG特征

    图像与某一个二维函数进行卷积运算实际就是求取图像与这一函数的相似性。同理,图像与高斯拉普拉斯函数的卷积实际就是求取图像与高斯拉普拉斯函数的相似性。当图像中的斑点尺寸与高斯拉普拉斯函数的形状趋近一致时,图像的拉普拉斯响应达到最大。
    

    Laplace可以用来检测图像中的局部极值点,但是对噪声敏感,所以在我们对图像进行Laplace卷积之前,我们用一个高斯低通滤波对图像进行卷积,目标是去除图像中的噪声点

    先对图像f(x,y)用方差为σ的高斯核进行高斯滤波,去除图像中的噪点。
    
    L(x,y;σ)=f(x,y)∗G(x,y;σ)
    G(x,y;σ)高斯核
    然后对图像的拉普拉斯图像则为:
    
    ∇^2=(∂^2L/∂^x2)+(∂^2L/∂y^2)
    而实际上有下面等式:
    
    ∇^2[G(x,y)∗f(x,y)]=∇^2[G(x,y)]∗f(x,y)
    
    我们可以先求高斯核的拉普拉斯算子,再对图像进行卷积
    

    使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG

    Haar特征

    Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为

    白色矩形像素和减去黑色矩形像素和

    Haar-like特征

    https://blog.csdn.net/zouxy09/article/details/7929570

    积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。
    
           积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算(这有个相应的称呼,叫做动态规划算法)。积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。
    
           我们来看看它是怎么做到的。
    
           积分图是一种能够描述全局信息的矩阵表示方法。积分图的构造方式是位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和:
    

    归一化图像

    i¯(x,y)=(i(x,y)−μ)/cσ
    公式中i¯(x,y)表示归一化之后的图像,而i(x,y)表示原始的图像,其中μ表示图像的均值,而σ表示图像的标准差
    σ2=(1/N)∑x2−μ2   2是平方
    

    SIFT特征

    SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换(物体怎么转,人都能识别)。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

    有4个主要步骤

    1、尺度空间的极值检测 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。

    $$$L(x,y,σ)=G(x,y,σ)∗I(x,y)$
    
    为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。构造高斯差分尺度空间(DOG scale-space): 
    $$D(x,y,σ)=(G(x,y,kσ)−G(x,y,σ))∗I(x,y)=L(x,y,kσ)−L(x,y,σ)$$
    
    σ 是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。
    
    对于一幅图像I,建立其在不同尺度(scale)的图像,后面每个采样都是原图的1/4倍。
    
    每个点都要与邻域的点,上下相邻尺度的点做比较(9+8+9)26个点作比较(以确保在尺度空间和二维图像空间都检测到极值点)。一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点
    

    2、特征点定位 在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。

    拟和三维二次函数以精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力
    

    用Harris Corner检测
    参考文章

    3、特征方向赋值 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。

    每个特征点计算一个方向,依照这个方向做进一步的计算, *利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。
    

    m ( x , y ) = ( L ( x + 1 , y ) − L ( x − 1 , y ) ) 2 + ( L ( x , y + 1 ) − L ( x , y − 1 ) ) 2 m(x,y)=(L(x+1,y)−L(x−1,y))2+(L(x,y+1)−L(x,y−1))2 m(x,y)=(L(x+1,y)L(x1,y))2+(L(x,y+1)L(x,y1))2
    √ θ ( x , y ) = a t a n 2 ( L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) √θ(x,y)=atan2(L(x,y+1)−L(x,y−1)L(x+1,y)−L(x−1,y) θ(x,y)=atan2(L(x,y+1)L(x,y1)L(x+1,y)L(x1,y)
    每个关键点有三个信息:位置、所处尺度、方向。由此可以确定一个SIFT特征区域。
    直方图
    4、特征点描述 在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

    高斯函数是唯一可行的尺度空间核

    尺度空间

    多分辨率图像金字塔:

    1、对原始图像进行平滑
    2、对处理后的图像进行降采样(通常是水平、垂直方向的1/2)降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。多分辨率的图像金字塔虽然生成简单,但其本质是降采样,图像的局部特征则难以保持,也就是无法保持特征的尺度不变性。
    

    高斯尺度空间:

    图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不同的参数模糊图像(分辨率不变)
    
    图像和高斯函数进行卷积运算,图像模糊,使用不同的“高斯核”可得到不同模糊程度的图像
    
    L(x,y,σ)=G(x,y,σ)∗I(x,y)
    
    其中G(x,y,σ)是高斯核函数
    G(x,y,σ)=(1/2Πσ^2)e^((x^2+y^2)/(2σ^2))
    

    构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,而检测特征点较好的算子是Δ^2G(高斯拉普拉斯,LoG)

    DoG特征

    使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG。

    DOG可以看作为LOG的一个近似,但是它比LOG的效率更高。
    设k为相邻两个高斯尺度空间的比例因子,则DoG的定义:

    D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ)
    

    L(x,y,σ) 是图像的高斯尺度空间
    将相邻的两个高斯空间的图像相减就得到了DoG的响应图像

    Harris角点特征提取

    Harris角点检测是一种基于图像灰度的一阶导数矩阵检测方法。检测器的主要思想是局部自相似性/自相关性,即在某个局部窗口内图像块与在各个方向微小移动后的窗口内图像块的相似性。

    1、角点可以是两个边缘的角点;
    2、角点是邻域内具有两个主方向的特征点;

    人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
    

    x y z = ( 1 + e x ) − 2 x y w x^{y^z}=(1+{\rm e}^x)^{-2xy^w} xyz=(1+ex)2xyw

    s q r t ( ) sqrt() sqrt()

    结论:1、增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。
    2、Harris角点检测算子对亮度和对比度的变化不敏感
    3、Harris角点检测算子具有旋转不变性
    4、Harris角点检测算子不具有尺度不变性

    展开全文
  • 针对描述子的性能与维数相矛盾的问题,提出了一种顽健的图像局部特征区域的描述方法。首先按照像素排序将局部特征区域分割为若干个子区域,然后利用基于阈值的分段局部描述子设计方法计算描述子,并采用纹理谱加权...
  • 针对现有底层特征识别扣件状态的算法存在描述能力差、错误率高等问题,提出一种基于扣件局部特征和语义信息的扣件检测模型。首先,在图像的非线性空间中计算扣件底层局部特征来表达扣件轮廓信息;然后,将图像分为四...
  • 局部特征匹配 Local Feature Matching项目要求项目原理局部特征图像中的特征点Harris角点(Harris Corner Detector)NMS(非最大值抑制)SIFT(尺度不变特征变换)实验步骤读取图像,并对图像进行预处理简介sepup_...

    项目要求

    1. 实现兴趣点检测
    2. 实现类SIFT局部特征描述
    3. 实现简单匹配算法
      在这里插入图片描述

    项目原理

    局部特征

    全局特征(global features)指的是图像的方差、颜色直方图等等,描绘了图像的整体信息,但是无法分辨出图像中的前景和背景。

    局部特征(loacl features)指的是一些局部才会出现的特征,而且该部分需要满足两个条件:1. 能够稳定出现; 2. 具有良好的可区分性。

    当我们所关注的对象在图像中受到部分遮挡,全局特征可能会被破坏,但局部特征依然能够稳定存在,以代表这个物体。

    图像中的特征点

    一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点。计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要。

    在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别、 图像配准、 视觉跟踪、 三维重建等。 这个概念的原理是, 从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像。 只要图像中有足够多可检测的兴趣点,并且这些兴趣点各不相同且特征稳定, 能被精确地定位,上述方法就十分有效。

    好的特征应该有以下几个特点:

    1. 重复性:不同图像的相同区域应该能被重复检测到,而且不受旋转、模糊、光照等因素的影响。
    2. 可区分性:不同的检测子应可通过检测对应的描述子进行区分。
    3. 数量适宜:检测子的数量过多或者过少都会降低识别精度。
    4. 高定位:检测子的大小和位置均应固定。
    5. 有效性:具有较快的检测速度。

    Harris角点(Harris Corner Detector)

    角点的基本原理:人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
    在这里插入图片描述

    角点具有一些良好的特征:视角变化时也仍然可以很好的辨识;和周围点在任何方向上变化都很大。角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。
    在这里插入图片描述
    Harris Corner是最典型的角点检测子,具有的优点是平移不变、旋转不变,能克服一定光照变化。

    NMS(非最大值抑制)

    NMS(Non-Maximum Supression)非最大抑制,就是抑制除最大值(局部最优)外的其他元素。比如在下图中要确认人行道上的车辆,需要找到区域内识别概率最大的框,所以将右边0.9的框和左边0.8的框高亮,之后遍历其他边框,如果和高亮的框交并比大于0.5,则将框进行淡化(抑制)。
    在这里插入图片描述

    SIFT(尺度不变特征变换)

    SIFT(Scale-Invariant Feature Transform)尺度不变特征变换,是计算机视觉领域对图像局部特征进行描述的常用方法,有以下四个关键步骤
    1. 尺度空间极值检测(Scale-space extrema detection)
    建立高斯差分金字塔,采用不同 σ \sigma σ(尺度)的高斯核对原图像进行卷积操作,得到一组不同层的图片,而不同组之间的图片通过降采样(隔点取点)得到。通过不断的变化高斯核和进行降采样,便可以得到高斯金字塔。再通过同一组不同两层之间的图片相减,就得到高斯差分金字塔(又叫尺度空间),如下图所示。
    其中,
    组数 O = [ l o g 2 ( m i n ( M , N ) ) ] − 3 O=[log_2(min(M,N))]-3 O=[log2(min(M,N))]3,其中M和N是图片的长和宽。
    层数 S = n + 3 S=n+3 S=n+3,其中n是希望提取从中特征的图片数目,因为做差分的过程中有一张图片无法使用,同时尺度空间上最上面一张和最下面一张图片无法求导,所以S-3=n。
    σ \sigma σ取法请见参考资料中原论文,不在此赘述。
    在这里插入图片描述
    理解:因为SIFT要解决尺度不变性问题,它的理念是不仅在任何尺度下拍摄的物体都能检测到一致的关键点,而且每个被检测的特征点都对应一个尺度因子。 在高斯金字塔中,其实降采样就是模拟了近大远小的尺寸变化,高斯核进行卷积模拟的是近处清晰,远处模糊。(PS:值得注意的是,高斯核是唯一一个可以模拟近处清晰,远处模糊的线性核)
    2. 关键点定位(Keypoint Localization)
    关键点需要满足:包含很多信息,稳定不易变化。关键点通常是极值位置。
    -> 1. 阈值化
    a b s ( v a l ) > 0.5 ∗ T / n abs(val)>0.5*T/n abs(val)>0.5T/n,其中T=0.04,因为如果太小了可能是噪声,不进行保留。
    -> 2. 在高斯差分金字塔中找极值
    在考虑了尺度空间后,如果一个像素点的值比周围26个像素点都大(小),那么就认为这个点是一个极值。
    在这里插入图片描述
    -> 3. 调整极值点的位置
    因为像素空间和尺度空间均是离散的,所有需要找到亚像素位置的精确极值点,具体操作是在检测到的极值点处做三元二阶泰勒展开,再对函数进行求导并令导数为零。
    -> 4. 舍去低对比度的点
    ∣ f ( X ) < T / n ∣ |f(X)<T/n| f(X)<T/n则认为该像素点事噪声,舍去点X
    -> 5. 边缘效应的去除
    3. 方向赋值(Orientation assignment)
    在最接近关键点尺度值 σ \sigma σ的高斯图像上,统计以特征点为圆心,以该特征点所在的高斯图像的尺度的1.5倍为半径的圆内所有像素的梯度方向以及其梯度幅值,并做 1.5 σ 1.5\sigma 1.5σ的高斯滤波。
    4. 关键点描述(Keypoint descriptor)
    关键点的描述符是一个128维的向量,用k近临算法进行向量匹配两个图片当中所有关键点的描述符中距离最近的两个描述符,并进行连接。
    在每一个子区域内统计八个方向上的梯度的经过高斯加权的长度,将每个子区域内的各个方向上的长度依次写出,便得到描述符。
    在这里插入图片描述

    Soble算子

    索贝尔算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
    Soble算子模版:
    Gx:
    在这里插入图片描述
    Gy:
    在这里插入图片描述

    实验步骤

    (一) 读取图像,并对图像进行预处理

    简介

    读取图像,将图片的长和宽放缩为原来的1/2,再转化为灰度图。

    sepup_image()

    def setup_image(img_name):
    	image = load_image('../data/'+img_name+'/'+img_name+'.jpg')#载入图像
    	eval_file = '../data/'+img_name+'/'+img_name+'Eval.mat'#载入标准匹配矩阵
    	scale_factor = 0.5 #设置缩放系数
    	image = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor)#将图片进行缩放
    	image_bw = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #进行灰度处理
    	return image_bw
    

    (二)使用Harris Corner Detector查找图像中的角点

    简介

    首先需要对图片进行兴趣点检测,我使用Harris Corner Detector来检查图像中的角点,通过用矩阵的行列式减去矩阵的平方来确定特定像素得分,得分越高的像素越具有角的特征,具体评判标准由阈值人为设定。如果像素的角点得分高于阈值,便认为它是一个角点,否则就忽略它。带有角点标记的图像如下面两张图所示。可见,检测到大量的角点,且角点在图像上的分布不均匀。为了保证角点分布的均匀性,我采用了自适应的MNS来抑制多余的角点。

    get_interest_points()

    1. 获得图片的尺寸(长和宽)
        ImageRows = image.shape[0]
        ImageColumns = image.shape[1]
    
    1. 利用Sobel算子进行边缘检测,第二个参数cv2.CV_64F表示64位浮点数即64float,第三和第四个参数分别是对X和Y方向的导数(即dx,dy),对于图像来说就是差分,这里1表示对X求偏导(差分),0表示不对Y求导(差分),第五个参数ksize是指核的大小。
        imX = cv2.Sobel(image, cv2.CV_64F,1,0,ksize=5)
        imY = cv2.Sobel(image, cv2.CV_64F,0,1,ksize=5)
    
    1. 计算Harris矩阵分量(包括矩阵特征值和迹,以及角点相应函数R)
       Ixx = (Xderivative)*(Xderivative)
       Iyy = (Yderivative)*(Yderivative)
       Ixy = (Xderivative)*(Yderivative)
       for i in range(16, ImageRows - 16):
       		for j in range(16, ImageColumns - 16):
       			Ixx1 = Ixx[i-1:i+1, j-1:j+1]
       			Iyy1 = Iyy[i-1:i+1, j-1:j+1]
       			Ixy1 = Ixy[i-1:i+1, j-1:j+1]
       			Ixxsum = Ixx1.sum()
       			Iyysum = Iyy1.sum()
       			Ixysum = Ixy1.sum()
       			Determinant = Ixxsum*Iyysum - Ixysum**2	#计算矩阵的特征值
       			Trace = Ixxsum + Iyysum	#计算矩阵的迹
       			R = Determinant - alpha*(Trace**2) #角点相应函数R
       			#判断每个像素相应函数是否大于阈值R,如果大于阈值则合格。
       			if R > threshold:
       				XCorners.append(j)
       				YCorners.append(i)
       				RValues.append(R)
       XCorners = np.asarray(XCorners)
       YCorners = np.asarray(YCorners)
       RValues = np.asarray(RValues)
    
    1. 使用非最大抑制算法(ANMS)进行角点过滤,返回满足条件的角点坐标和得分。ANMS函数在下面给出。
        NewCorners = ANMS(XCorners, YCorners, RValues, 3025)
        NewCorners = np.asarray(NewCorners)
        x = NewCorners[:,0]
        y = NewCorners[:,1]
        scales = NewCorners[:,2]
        return x,y, scales
    

    输出

    下图为Harris Corner Detector对NotreDame图像的角点检测结果。
    在这里插入图片描述
    在这里插入图片描述

    (三)使用ANMS进行角点筛选以获得高分特征点

    简介

    使用Harris Corner Detector生成的角点不是均匀分布的。在许多情况下角点可能集中在图像的特定区域,从而导致准确性的下降。NMS算法通过在特征函数中寻找局部最大值并丢弃剩余的次大值(即图像中的临近角点)。通过使用该算法,可以提高特征匹配的准确性,但是传统的NMS具有某些局限性,例如图像中特征点在处理后可能会不均匀分布。为了避免这种情况,所以使用ANMS算法(自适应非最大值抑制),基本思想是仅保留r个像素附近最大的那些点。下面两张图显示了使用Harris角点检测器生成的特征点与抑制后剩余的特征点之间的比较。可见,图像中的特征点已从数7000个左右抑制到1500个,且均匀分布。

    ANMS()

    def ANMS (x , y, r, maximum):
    	i = 0
    	j = 0
    	NewList = []
        while i < len(x):
            minimum = 1000000000000
            #获得一个harris角点的横纵坐标,称为基础点
            X, Y = x[i], y[i]
            while j < len(x):#遍历除该角点外每一个得分(R值)更高的角点,称为比较点,找到离基础点最近的一个比较点,记录下基础点的横纵坐标和与最近比较点之间的距离
                CX, CY = x[j], y[j]
                if (X != CX and Y != CY) and r[i] < r[j]:
                    distance = math.sqrt((CX - X)**2 + (CY - Y)**2)
                    if distance < minimum:
                        minimum = distance
                j = j + 1
            NewList.append([X, Y, minimum])
            i = i + 1
            j = 0
        #根据距离大小对基础点进行排序,很显然,距离越小的点说明在该角点周围有更好的角点,所以可以适当舍弃。在舍弃一定数目的得分较小的角点后,就得到了非最大抑制后的harris角点坐标。
        NewList.sort(key = lambda t: t[2])
        NewList = NewList[len(NewList)-maximum:len(NewList)]
        return NewList
    

    输出

    下图显示了NotreDame图像使用ANMS进行角点筛选后的特征点。
    在这里插入图片描述
    在这里插入图片描述

    (四)构建SIFT功能描述符

    简介

    为每个特征点创建的特征向量,用于将第一幅图像的关键点与第二幅图像的关键点进行匹配。为此,计算第一图像中每个关键点的每个特征向量到第二图像中每个特征向量的距离。然后对距离进行排序,并获取和比较两个最小距离。为了使关键点与第二个图像中的另一个关键点精确匹配,计算并检查两个最小距离的比率是否大于指定的阈值,之后将其视为关键点。

    get_features()

    功能

    获得给定兴趣点集的一组特征描述符。

    参数

    image:灰度图
    x:兴趣点的x坐标(np array)
    y:兴趣点的y坐标(np array)
    feature_width:局部特征宽度(以像素为单位)

    返回值

    fv:规范化特征向量

    具体步骤

    1. 初始化高斯滤波器,使用高斯模糊降低图像中的噪点,并获得图像的尺寸。
      filter1 = cv2.getGaussianKernel(ksize=4,sigma=10)
      filter1 = np.dot(filter1, filter1.T)
      image = cv2.filter2D(image, -1, filter1)
      ImageRows = image.shape[0]
      ImageColumns = image.shape[1]
      xlen = len(x)
      ylen = len(y)
      FeatureVectorIn = np.ones((xlen,128))
      NormalizedFeature = np.zeros((ylen,128))
    
    1. 遍历Harris算法得到的每一个角点坐标,提取以该角点坐标为中心的16x16像素的一个局部图像,对于每一个局部图像,拆分成16个4x4像素的窗口,计算窗口内每个像素的大小和方向。
    for i in range(xlen):
    	temp1 = int(x[i])
      	temp2 = int(y[i])
     	Window = image[temp2-8:temp2 + 8, temp1-8:temp1 + 8]
      	WindowRows = Window.shape[0]
      	WindowColumns = Window.shape[1]
      	for p in range(4):
        	for q in range(4):
          		WindowCut = Window[p*4:p*4 +4,q*4: q*4+4]
          		NewWindowCut = cv2.copyMakeBorder(WindowCut, 1, 1, 1, 1, cv2.BORDER_REFLECT)
          		Magnitude = np.zeros((4,4))
          		Orientation = np.zeros((4,4))
          		for r in range(WindowCut.shape[0]):
            		for s in range(WindowCut.shape[1]):
              			Magnitude[r,s] = math.sqrt((NewWindowCut[r+1,s] - NewWindowCut[r-1,s])**2 + (NewWindowCut[r,s+1] - NewWindowCut[r,s-1])**2)
              			Orientation[r,s] = np.arctan2((NewWindowCut[r+1,s] - NewWindowCut[r-1,s]),(NewWindowCut[r,s+1] - NewWindowCut[r,s-1]))
    
    1. 对于每一个窗口,以方向为横坐标建立直方图(共8个方向),窗口内所有像素在方向上的加权和为直方的幅度值,这样就得到了每一个角点的局部图像中每个窗口表示大小和方向的特征向量。
            Magnitude = Magnitude
            OrientationNew = Orientation*(180/(math.pi))
            hist, edges = np.histogram(OrientationNew, bins = 8, range = (-180,180), weights = Magnitude)
            for t in range(8):
            	l = t+p*32+q*8
              	FeatureVectorIn[i,l] = hist[t]
    
    1. 正则化特征向量,并返回值。
     for a in range(FeatureVectorIn.shape[0]):
     	sum1 = 0
      	for b in range(FeatureVectorIn.shape[1]):
       		sum1 = sum1 + (FeatureVectorIn[a][b])*(FeatureVectorIn[a][b])
     	sum1 = math.sqrt(sum1)
       for c in range(FeatureVectorIn.shape[1]):
         NormalizedFeature[a][c] = FeatureVectorIn[a][c]/sum1
     fv = NormalizedFeature
     return fv
    

    输出

    下图显示了NotreDame图像对中前100个关键点匹配项。
    在这里插入图片描述

    (五)特征匹配

    简介

    在得到两个图像的SIFT特征描述符和Harries算法得到的角点坐标后,即可通过计算特征向量之间的距离,进行图像的特征匹配。

    match_features()

    1. 对于图片1的每一个SIFT特征描述符遍历图片2的每一个SIFT特征描述符,分别计算它们和图一特征向量之间的欧式距离。
    	for x in range(features1.shape[0]):
    		for y in range(features2.shape[0]):
    			ExtractedRow1 = features1[[x],:]
    			ExtractedRow2 = features2[[y],:]
    			SubtractedRow = ExtractedRow1 - ExtractedRow2
    			Square = SubtractedRow*SubtractedRow
    			Sum = Square.sum()
    			Sum = math.sqrt(Sum)
    			Distance[x,y] = Sum
    
    1. 按照距离大小对图片2的特征向量进行升序排序,取与图一特征向量距离最小的两个,若两者的距离只比小于阈值,则说明最佳的匹配效果较好,记录下图一和图二两个特征向量的坐标。若大于阈值则不操作。在对图一所有特征向量遍历完后,返回每一对需匹配的特征向量的坐标,和两者之间的距离。
    		IndexPosition = np.argsort(Distance[x,:])
    		d1 = IndexPosition[0]
    		d2 = IndexPosition[1]
    		Position1 = Distance[x,d1]
    		Position2 = Distance[x,d2]
    		ratio = Position1/Position2
    		if ratio<0.8: 
    			Hitx.append(x)
    			Hity.append(d1)
    			Value.append(Position1)
    	Xposition = np.asarray(Hitx)
    	Yposition = np.asarray(Hity)
    	matches = np.stack((Xposition,Yposition), axis = -1)
    	confidences = np.asarray(Value)
    	return matches, confidences
    

    效果

    在这里插入图片描述

    实验结果

    load 标准配对数据文件和SIFT功能描述符的匹配结果进行比较,结果如下:

    1. NotreDame的配对准确率为79%,如下图所示
      在这里插入图片描述
    2. MountRushmore的配对准确率为32%,如下图所示。
      在这里插入图片描述
      其他:
    3. LaddObservatory在这里插入图片描述

    参考链接

    Project 2: Local Feature Matching
    CSCI 1430: Introduction to Computer Vision
    特征检测和特征匹配方法
    局部特征(1)——入门篇
    Harris角点
    C4W3L07 Nonmax Suppression
    Distinctive Image Features from Scale-Invariant Keypoints-David G. Lowe

    项目源码下载链接

    局部特征匹配 Local Feature Matching

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,932
精华内容 85,172
关键字:

局部特征