传统图像特征提取方法及其应用
计算机视觉课程报告
一、特征提取方法原理
SIFT(尺度不变特征变换)
原理:
- 尺度空间极值检测:通过高斯差分金字塔检测图像中的关键点
- 关键点定位:通过泰勒展开和Hessian矩阵消除不稳定特征点
- 方向分配:计算关键点邻域梯度方向直方图确定主方向
- 描述子生成:将16x16邻域划分为4x4子区域,每个子区域计算8方向梯度直方图, 形成128维特征向量
LBP(局部二值模式)
原理:
- 邻域比较:对每个像素的3x3邻域进行阈值处理
- 二进制编码:将邻域像素与中心值比较,生成8位二进制数
- 直方图统计:统计图像中不同LBP模式的分布
- 改进方法:圆形邻域(扩展LBP)、均匀模式(Uniform LBP)
HOG(方向梯度直方图)
1. 基本思想
HOG(Histogram of Oriented Gradients)通过统计图像局部区域的梯度方向分布来表征物体特征。其核心假设是:
- 物体形状可由边缘和梯度分布描述
- 局部梯度方向对光照变化具有鲁棒性
2. 数学基础
(这里不清楚是什么原因导致的数学公式反复渲染 会存在一次数学公式和渲染前的文字)
- 梯度计算:
- 幅值与方向:
3. HOG流程
-
图像预处理:
-
可以对图像进行裁剪,并缩放到固定尺寸。 灰度处理是可选操作,因为灰度图像和彩色图像都可以用于计算梯度图,对于彩色图像,先对三通道颜色值分别计算梯度,然后取梯度值最大的那个作为该像素的梯度。 然后进行伽马矫正,调节图像对比度,减少光照对图像的影响(包括光照不均和局部阴影),使过曝或者欠曝的图像恢复正常,更接近人眼看到的图像。
-
计算梯度直方图:
-
图像划分为若干 个8x8的小单元,称为cell,并计算每个cell的梯度直方图。 一个8x8的小单元就包含了8x8x2 = 128个值,把这个8x8的小单元用长度为9的数组来表示,这个数组就是梯度直方图。这种表示使得特征更加紧凑,而且对单个像素值的变化不敏感,也就是能够抗噪声干扰。
-
下图为图片中的一个cell中的梯度
-
左图是 8×8 的cell中表示梯度的原始数字,注意角度的范围介于0到180度之间,而不是0到360度, 这被称为“无符号”梯度,因为两个完全相反的方向被认为是相同的。 现在我们来计算cell中像素的梯度直方图,先将角度范围分成9份,也就是9 bins,每20°为一个单元,也就是这些像素可以根据角度分为9组。将每一份中所有像素对应的梯度值进行累加,可以得到9个数值。直方图就是由这9个数值组成的数组,对应于角度0、20、40、60... 160。
-
将这 8x8 的cell中所有像素的梯度值加到各自角度对应的bin中,就形成了长度为9的直方图,可以用这9个数的梯度直方图来代替原来很大的三维矩阵,即代替了8x8x2个值
-
Block 归一化(L2-Hys)
-
图像的梯度对整体光照非常敏感,比如通过将所有像素值除以2来使图像变暗,那么梯度幅值将减小一半,因此直方图中的值也将减小一半。 理想情况下,我们希望我们的特征描述符不会受到光照变化的影响,那么我们就 需要将直方图“归一化”。
-
归一化步骤为:
- HOG将8×8的一个区域作为一个cell,再以2×2个cell作为一组,称为block。由于每个cell有9个值,2×2个cell则有36个值,HOG是通过滑动窗口的方式来得到block的,如下图所示:
-
block的梯度直方图进行归一化(注意不是cell),一个block有4个直方图,将这4个直方图拼接成长度为36的向量,然后对这个向量进行归一化。 因为使用的是滑动窗口,滑动步长为8个像素,所以每滑动一次,就在这个窗口上进行归一化计算得到长度为36的向量,并重复这个过程。
-
计算HOG特征向量
-
每滑动一次,一个block就得到一个长度为36的特征向量,如上面这个图,将整幅图像划分成cell的个数为8x16,就是横向有8个cell,纵向有16个cell 。每个block有2x2个cell的话,那么block的个数为:(16-1)x(8-1)=105。即有7个水平block和15个竖直block。 再将这105个block合并,就得到了整个图像的特征描述符,长度为 105×36=3780。
-
HOG算法流程
graph TD
A[输入图像] --> B(预处理:转为单通道灰度图(减少计算量))
B --> C[梯度计算:
计算水平和垂直梯度,再计算x和y方向梯度的合梯度,包括幅值和方向]
C --> D[计算梯度直方图:
单元划分:将图像分为8×8像素的cell
加权投影:分配梯度幅值到相邻bin]
D --> E[块归一化
块构造:2×2 cell组成16×16像素的block(50%重叠滑动)
归一化方法(L2-Hys):计算L2范 数->初步归一化->截断限制->重新归一化]
E --> F[特征拼接:
维度计算(64×128图像):
横向block数:(64/8)-1=7
纵向block数:(128/8)-1=15]
F --> G[输出特征向量]
二、应用场景
图像匹配(SIFT)
- 特征点匹配:通过计算特征向量间的欧氏距离寻找匹配点对
- 图像拼接:利用RANSAC算法消除误匹配,实现全景图拼接
- 实例:无人机航拍图像配准、医学图像对齐
目标检测(HOG)
- 滑动窗口检测:在不同尺度上提取HOG特征
- 典型应用:行人检测、车辆检测
- 优势:对几何和光学变化具有鲁棒性
纹理分类(LBP)
- 人脸识别:LBP特征+AdaBoost分类器
- 工业检测:产品表面缺陷检测
- 生物特征:指纹识别、虹膜识别
HOG(方向梯度直方图)原理详解
一、核心思想
通过统计图像局部区域的梯度方向分布来表征物体形状特征,特别擅长捕捉边缘和轮廓信息,对光照变化和微小位移具有鲁棒性。
二、算法流程分解
1. 预处理与归一化
# 典型输入参数
image = cv2.resize(img, (64,128)) # 标准化图像尺寸
gamma = 1.0 # Gamma校正参数
三、HOG+SVM行人检测实例
主要思想:
- 在一幅图像中,局部目标的表象和形状能够利用梯度或边缘的方向密度分布来进行描述。其本质是梯度的统计信息,而梯度主要存在于边缘所在的地方,HOG通过计算和统计局部区域的梯度方向直方图来构成特征,结合SVM分类器,应用于图像识别中。
- 由于HOG是在图像的局部方格单元上进行操作的,所以它对图像的几何和光学形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征特别适合于做图像中的人体检测。
graph TD
%% 训练阶段
subgraph 训练流程
A[步骤1: 收集正样本块] --> C[HOG特征提取]
B[步骤2: 收集负样本块] --> C
C --> D[步骤3: 初始SVM训练]
D --> E[步骤4: Hard-Negative Mining]
E --> F{新误报样本?}
F -->|是| G[步骤5: 排序误报样本]
G --> H[更新训练集]
H --> D
F -->|否| I[获得最终模型]
end
%% 检测阶段
subgraph 检测流程
J[步 骤6: 测试图片预测] --> K[多尺度滑动窗口]
K --> L[步骤7: NMS去重]
L --> M[输出检测结果]
end
%% 流程连接
I --> J
%% 交互提示(符合Mermaid语法)
click E "javascript:void(0)" "在负样本图像上执行:
1. 多尺度滑动窗口
2. 提取误报样本
3. 记录概率值"
click F "javascript:void(0)" "迭代终止条件:
连续3次误报样本增量<5%"
click L "javascript:void(0)" "非极大值抑制算法:
1. 按置信度排序
2. IOU阈值过滤
3. 保留最高分框"
1. 数据准备
# 加载INRIA行人数据集(示例)
pos_samples = load_pos_samples() # 包含行人的图像
neg_samples = load_neg_samples() # 不包含行人的图像
test_samples = load_test_samples() #测试图像
pos_samples, neg_samples, test_samples = load_data_set()
2. 训练与测试流程
samples, labels = load_train_samples(pos, neg) #载入训练图像
train = extract_hog(samples,winSize,blockSize,
blockStride,cellSize,nbins) #提取HOG特征
svm_detector = train_svm(train, labels) #训练SVM
test_hog_detect(test, svm_detector) #测试
测试实例:
HOG方法局限
- 特征表达能力局限
旋转敏感性
HOG特征本身不具备旋转不变性,需通过扩充不同旋转角度的训练样本来实现近似旋转鲁棒性26。当目标姿态变化超过训练样本覆盖范围时,检测准确率显著下降,尤其对肢体姿态大幅变化的目标(如舞蹈动作)适应性差