Advertisement

图像局部特征提取

阅读量:

图像特征 可涵盖色调、纹路、轮廓以及局部特徵點等多種類型。其中局部特性具有較高的穩定性不易受外界環境因素影響。圖像特徵提取 在圖像分析與識別領域中被承认为基礎工作 它是將複雜的數據結構進行簡化表達的方式 從一幅圖像的數據矩陣中难以直接提取所需信息 因此我們需要根據這些數據進一步處理並从中遴選出關鍵的信息 最後识别出构成圖像的基本元素及其相互關係

图像局部特征 的描述主要关注点是稳定性(鲁棒性的增强)和唯一(可区分性的提升)。当采用局部图像特征描述子时,则主要用于提高在不同图像变换下表现的有效性和可靠性。在设计或构建特征描述子时,《鲁棒性和唯一性的保障》是首要任务。对于宽基线匹配场景,《几何变换》影响下的一致需求必须得到满足;而对于形状识别以及物体检索,《形态特异性》则成为关键考量。

局部位置是描述图像局部特性的数学表达式

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

斑块与格子是两种局部特征类型。
斑块通常是具有颜色与亮度差异明显的区域,
例如草原上的一棵树或一栋建筑。
它们被视作一个区域,
具备较强的抗噪声能力以及稳定性。
而格子则主要标记着物体的拐折处
或者线条间的交叉部位。

斑点检测原理与举例

LoG与DoH

主要的斑点检测方法包括运用基于高斯拉普拉斯算子的计算方法(LOG),此外,则有基于像素点Hessian矩阵及其行列式的计算方法(DOH)。

基于图像点二阶微分的Hessian矩阵及其行列式的值等特性,Hessian矩阵行列式的绝对值不仅能够反映图像局部的空间结构特征,同时也为后续特征提取提供了重要的判别依据.相较于LoG算子而言,DoH方法在抑制细长目标斑点方面具有更好的性能表现.

无论是Log(I(x,y))还是DoH(Determinant of Hessian),它们对于图像中的斑点进行检测时的原理和流程均存在显著差异。其检测过程均可分为两个阶段:首先通过计算梯度幅值确定候选斑点区域;其次基于这些候选区域进行进一步的特征提取以确认最终的斑点位置。

  1. 采用不同的生成或预设模板,并对图像执行二维线性卷积运算;
  2. 基于图像的位置空间与尺度空间中分别计算Log算子和DoG算子的空间位置及其峰值位置。

SIFT(尺度不变特征变换)

Scale-Invariant Feature Transform (SIFT) is a computer vision algorithm designed to detect and describe local features in images. It achieves this by performing multi-scale analysis to identify extremum points and determine the position, scale, and rotation characteristics of these points. This feature descriptor demonstrates extremely robust performance.

SIFT算法详细介绍

SIFT算法步骤

  1. 构建DOG尺度空间

分析图像数据在不同尺度下的特征表现, 宏观层面捕捉整体轮廓, 微观层面关注细节部分. 通过构建基于不同高斯核\sigma的高斯金字塔(每一层进行高斯模糊处理并加权融合), 确保无论在哪个分辨率下都能捕获相应的关键点位置, 即保证尺度不变性.

  1. 关键点搜索和定位:

判断该点是否为关键点需要与同尺度空间中不同值的图像进行比较,在该点处达到极大或极小值时即可判定其为一个特征点。提取完特征点后需剔除低对比度和不稳定边缘效应的候选关键点,并筛选出具有代表性的关键点(例如,在正方形旋转至菱形时使用边缘检测方法会导致四个边完全不同而出现错误;而采用角点检测则能有效避免这种情况)。通过剔除这些非稳定候选关键点不仅能够有效提升关键点检测的抗噪声能力还能显著提高匹配算法的稳定性。最后对离散的关键点集合进行曲线拟合从而获得精确的关键位置信息以及对应的尺度参数。

  1. 方向赋值

为了达到旋转不变性的目的 ,需要依据检测到的关键点及其局部图像特征为特征点赋值 。具体而言 ,该方法采用梯度方向直方图来进行描述 。在计算直方图的过程中,在每个采样点上应用圆形高斯函数进行加权处理 ,即执行高斯平滑处理 。主要原因在于SIFT算法仅考虑了尺度和旋转不变性 未考虑仿射不变性 。通过执行高斯平滑处理后 ,可以在关键点附近赋予较大的权重系数 ,从而弥补未考虑仿射变换所带来的特征描述不稳定问题 。值得注意的是 ,一个关键点可能对应多个特定的方向描述 这一特点有助于提高图像匹配的鲁棒性 。

  1. 关键点描述子生成

关键点描述子不仅包含关键点本身,还包含在其周围的那些对目标检测有贡献的像素点。这有助于使关键点更加具有不变特性性状,在匹配目标时能够提高效率。在构建描述子采样区域时,在旋转后进行双线性插值是必要的步骤之一;这样做可以有效避免因旋转图像而产生的白色干扰现象(white noise)。为了确保旋转后的不变性状(invariant property),建议基于特征点为中心,在其局部区域内绕一定角度θ进行旋转变换;然后通过计算采样区域的梯度直方图来形成n维SIFT特征矢量(如128-SIFT)。最后为了消除光照变化带来的影响,则必须对特征矢量执行归一化处理。

SIFT特征提取的优点

  1. SIFT特征作为图像局部特征,在面对旋转、尺度缩放和亮度变化时展现出良好的抗变性能,在视角变化和仿射变换等方面也呈现一定的稳定性;
  2. 该方法具有独特性和丰富信息量,在海量特征数据库中实现高效且精确的匹配;
  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角点特征提取

Harris角点检测是一种基于图像灰度的一阶导数矩阵的方法用于实现特征点定位。其核心理念在于通过分析局部区域内的图像块与其在不同方向上微小平移后的对应区域之间的相似程度来确定关键点位置。该算法认定,在像素周围的边缘分布中存在多个不同方向的边缘特征从而将其识别为稳定且具有区分度的角点

Harris算法步骤

采用水平与垂直差分算子对图像中的每个像素执行滤波操作以获得I_xI_y;从而得到在点x处的对称半正定矩阵M_I = M_I(x)

  1. 决定权重矩阵W(其中常用高斯滤波器G作为其典型实现)并对其进行图像域内的滤波处理
    通过计算每个像素处的角点度量cim得到对应的R值:

在该矩阵中,请注意以下两点:首先,在该区域内任一点若同时满足大于阈值 thresh 和属于某领域内的局部极大值,则这些满足上述两个条件的点即被识别为角点。

增大阙值会导致提取到的角点数量减少;而减小阙值则会增加这些角点的数量。
此外,在计算局部极大值时所采用的领域大小将直接影响到所提取到的角点数量以及系统的容错能力。

Harris角点性质

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

在Harris角点检测过程中, 应用了微分算子来进行图像微分运算. 但这种运算对于图像密度的提升或缩小以及亮度的增加或减少的变化并不敏感. 换句话说, 对于亮度与对比度进行仿射变换并不会改变Harris响应中的极值点位置, 然而由于阈值选择的不同, 可能会影响到最终检测到的关键点数量。

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

Harris角点检测算子基于角点附近的局部灰度二阶矩矩阵进行计算。其形态可表现为一个椭圆,并且该椭圆的长短轴长度与所对应的二阶矩矩阵特征值平方根的倒数直接相关。值得注意的是,在该椭圆发生旋转时其特征参数并不会发生改变从而导致响应值保持不变因此我们可以得出结论:该检测算子对于旋转具有不变性。

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

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) 
    
     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章
图像特征提取技术综述
基于局部区域的图像描述方法
基于角点检测的图像特征提取算法研究
关键斑点识别技术分析
SIFT特征定位机制及其应用解析
改进型SIFT算法及其性能优化探讨
改进型SIFT特征提取方法研究
基于Harris准则的角点检测方法分析
基于FAST算法的快速角点识别技术探讨

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

全部评论 (0)

还没有任何评论哟~