基于MATLAB的局部自相似特征(LSS)提取与匹配系统
项目简述
本项目是一个基于MATLAB开发的计算机视觉算法演示系统,旨在完整复现并实现Shechtman和Irani在论文《Matching Local Self-Similarities across Images and Videos》中提出的局部自相似(Local Self-Similarity, LSS)描述子。
LSS算法的核心优势在于它不依赖图像的直接光度特性(如颜色、强度),而是捕捉图像内部的局部几何布局模式。这使得该算法在跨模态匹配(如草图与照片配准)、剧烈光照变化及纹理变化场景下具有极佳的鲁棒性。本代码包含了一个完整的流程:从模拟跨模态数据生成、对数极坐标掩膜预计算、LSS特征密集提取、特征匹配到最终的可视化展示。
主要功能特性
- 跨模态数据模拟:内置代码自动生成模拟数据(实心物体图与带噪声的边缘轮廓图),无需外部数据集即可直接演示算法对不同模态图像的匹配能力。
- 局部自相似描述子提取:
* 基于图像块(Patch)的差平方和(SSD)计算。
* 生成局部自相似相关性曲面(Correlation Surface)。
* 采用对数极坐标(Log-Polar)几何划分,提供一定的尺度和旋转不变性。
* 在每个几何区间(Bin)内采用
最大池化(Max Pooling)策略提取特征。
* 多级归一化处理(去均值、标准化、L2归一化)以增强对比度鲁棒性。
- 特征匹配:基于欧氏距离的最近邻匹配,包含Lowe's Ratio Test策略以剔除错误匹配。
- 丰富的可视化:
*
微观视角:展示单个采样点的源位置、对应的相关性热力图(SSD Surface)以及生成的描述子向量柱状图。
*
宏观视角:在源图像和目标图像之间绘制匹配连线,直观展示匹配效果。
系统要求
- MATLAB R2016a 或更高版本。
- Image Processing Toolbox(用于图像显示、颜色映射及边缘检测函数
edge)。
使用方法
- 将代码保存为
main.m 文件。 - 在MATLAB命令窗口中直接运行
main。 - 系统将自动执行以下步骤:
* 生成测试图像数据。
* 计算特征并进行匹配。
* 弹出两个绘图窗口:
*
Local Self-Similarity Surface Visualization:显示图像中心的特征点详细信息。
*
LSS Matching Result:显示两张图像之间的特征点匹配连线。
详细实现逻辑与算法分析
本项目的所有功能逻辑均包含在一个主脚本文件中,以下是对代码关键部分的详细分析:
1. 数据生成与预处理
代码首先构建了一个典型的跨模态匹配场景。如果不提供外部输入,脚本会自动生成:
- 图像1 (模拟照片):一个具有矩形特征的灰色实心图像,包含不对称元素。
- 图像2 (模拟草图):基于图像1生成的Canny边缘图,并添加了高斯噪声。
这种设置直接挑战了算法在纹理和像素值完全不同的情况下的匹配能力。
2. 对数极坐标掩膜预计算 (Precompute Log-Polar Masks)
为了提高描述子的几何不变性,代码通过
precompute_log_polar_masks 函数预先计算了空间划分掩膜:
- 几何结构:将特征点周围区域划分为多个径向(Radius)和角向(Angular)区间。
- 对数尺度:半径方向采用对数刻度(Log-scale),这意味着越靠近中心的区域划分越细致,越外围的区域越宽泛,符合人眼视觉特性。
- 索引存储:函数返回每个Bin对应的像素线性索引,极大地加速了后续描述子生成时的提取速度。
3. LSS特征提取核心 (Extract LSS Features)
extract_lss_features 函数采用网格采样(Grid Sampling)的方式遍历图像,具体步骤如下:
对于每一个采样点,代码定义了一个中心图像块(Patch)和一个较大的搜索区域(Region)。通过
compute_ssd_surface 函数,利用滑动窗口逐点计算搜索区域内各子块与中心块的差平方和(SSD)。代码中实现了基于循环的非FFT滑动窗口计算方法。
将SSD值转换为相关性分数,公式采用
exp(-SSD / sigma)。其中
sigma采用了自适应策略,取当前区域SSD方差与预设噪声基底的最大值,这保证了在平坦区域和纹理丰富区域都能获得合理的响应。
- 描述子生成 (Log-Polar Descriptor):
利用预计算的掩膜,调用
compute_log_polar_descriptor 函数。算法在每一个对数极坐标Bin内寻找
最大相关值(Max Pooling)。这种策略允许特征出现微小的局部变形而不影响描述子数值。
为了应对光照和对比度变化,生成的特征向量经过了严格的后处理链:
1. 减去最小值。
2. L1 预归一化。
3. 标准化(减均值除以标准差)。
4. 最终的 L2 归一化。
4. 特征匹配 (Match Descriptors)
match_descriptors 函数实现了向量间的相似度计算和筛选:
- 距离矩阵计算:使用向量化操作高效计算两个特征集合之间的欧氏距离矩阵(利用公式 $(a-b)^2 = a^2 + b^2 - 2ab$)。
- 筛选策略:
*
最近邻搜索:为图像1中的每个点找到图像2中距离最近的点。
*
比率测试 (Ratio Test):计算最近邻距离与次近邻距离的比值。如果比值小于 0.85,则认为该匹配具有区分度并予以保留(参考Lowe的SIFT匹配策略)。
*
保底机制:如果有效匹配数过少(小于5个),代码会自动退化为输出距离最小的前N个匹配,确保演示效果。
5. 可视化模块
- 单点热力图:选取一个中心特征点,通过
imagesc 绘制其相关的SSD曲面热力图,可以清晰观察到自相似特征在局部的分布情况。 - 匹配连线图:通过
visualize_matches 将两张图像拼接,根据计算出的坐标偏移量绘制连线。正确的连线应呈现平行的态势,连接实心物体的角点与边缘图对应的角点。