基于默林变换的图像尺度不变模式识别系统
项目简介
本项目基于MATLAB平台开发,旨在解决计算机视觉与模式识别从由于目标物体距离远近或大小改变而导致的尺度变化(Scale Variation)识别难题。系统核心算法采用傅里叶-默林变换(Fourier-Mellin Transform, FMT),利用默林变换独特的数学性质,将图像在空间域的缩放和旋转转换为频率域的平移,最终通过频谱分析提取出具有平移、旋转、缩放不变性(RST Invariant)的特征描述子。
该项目包含完整的数据生成、特征提取、相似度匹配及可视化流程,特别适合用于探究变换域中的模式识别原理。
功能特性
- 全自动仿真数据生成:无需外部图片文件,代码内置合成图像生成器,可生成带有纹理的参考图像、经缩放/旋转/平移变换的目标图像,以及形状不同的干扰图像。
- RST不变性特征提取:实现了完整的傅里叶-默林变换流程,能够从图像中提取出不受位置、角度和大小影响的特征向量。
- 频域变换可视化:系统将算法的每一步骤(原图 -> 频谱 -> 对数极坐标图 -> 不变特征图)以子图形式直观展示,便于理解算法物理意义。
- 模式匹配与分类:利用归一化互相关系数(NCC)量化特征相似度,自动判定图像是否匹配。
系统要求
- MATLAB R2016b 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 将项目代码保存为
.m 文件。 - 在MATLAB中打开并运行主函数
main。 - 程序将输出生成图像的进度提示及最终的识别结果。
- 程序运行结束后,会弹出一个包含12幅子图的窗口,分别展示参考图像、匹配图像(缩放/旋转后)和干扰图像的各个处理阶段,并在控制台打印详细的相似度得分。
核心算法实现逻辑
本项目 main.m 文件严格遵循以下逻辑流程,实现了端到端的识别系统:
1. 仿真数据生成
系统首先通过
generate_synthetic_images 函数在内存中构建256x256像素的灰度测试图:
- 参考图像:中心位置带有正弦纹理的矩形。
- 变换图像:将参考图像进行缩放(0.6倍)、旋转(45度)以及平移操作,用于验证算法的不变性。
- 干扰图像:具有相同纹理但形状为圆形的图像,用于验证算法的区分能力。
- *注:代码支持添加高斯噪声,默认噪声等级设置为0.0。*
2. 傅里叶-默林变换(FMT)流水线
核心特征提取通过
compute_fmt_features 函数实现,具体步骤如下:
- 第一级变换(获取平移不变性):
* 对输入图像进行二维快速傅里叶变换(FFT)。
* 取频谱的幅度谱(Magnitude Spectrum)。根据傅里叶变换性质,空间域的平移仅影响相位,幅度谱保持不变,从而消除平移影响。
- 第二级变换(对数极坐标映射):
* 将第一步得到的频谱幅度图从笛卡尔坐标系 $(x, y)$ 映射到对数极坐标系 $(log rho, theta)$。
* 在此变换下,图像的缩放因子转化为 $log rho$ 轴的线性平移,旋转角度转化为 $theta$ 轴的线性平移。
- 第三级变换(获取缩放旋转不变性):
* 对对数极坐标图像再次进行二维傅里叶变换(实质上即默林变换的核心)。
* 再次取幅度谱。此时,由缩放和旋转引起的“线性平移”在新的频域中转化为相位差,其幅度谱因此具有了缩放和旋转不变性。
3. 特征匹配
- 使用
corr2 计算参考图像特征与待测图像特征之间的二维相关系数。 - 设定阈值(代码中为 0.8),若相关系数高于阈值则判定为同一目标,否则判定为不同类。
关键函数与算法细节
compute_fmt_features(img, params)
这是算法的主引擎。
- 输入:灰度图像。
- 处理:依次执行
fft2 -> fftshift (中心化) -> abs -> log_polar_transform -> fft2 -> abs。 - 输出:不仅输出最终的FMT不变特征矩阵,还结构化输出了中间过程的FFT频谱图和对数极坐标图供可视化使用。
- *代码细节*:虽然注释提到了汉宁窗预处理,但实际代码为了演示清晰度,直接对原始图像数据进行了FFT变换。
log_polar_transform(img, n_rho, n_theta)
实现了笛卡尔坐标到对数极坐标的重采样。
* 角度 $theta$:从 $0$ 到 $2pi$ 线性采样。
* 半径 $rho$:使用
linspace 在 $log(r_{min})$ 到 $log(r_{max})$ 之间线性采样,实现了对数尺度的转换。
* 利用 $r = e^rho$ 计算对应的极坐标半径。
* 通过 $x = r costheta + c_x$, $y = r sintheta + c_y$ 计算采样点在原图中的坐标。
* 使用
'linear' (双线性插值) 方法通过
interp2 提取像素值,超出边界的部分填充为0。
generate_synthetic_images(noise_level)
- 使用了
meshgrid 生成正弦波纹理,增加了图像的频域复杂度,避免因图像过于简单(如纯色块)导致频谱特征单一。 - 利用 MATLAB 内置的
imresize 和 imrotate 模拟真实的几何畸变。 - 手动计算并在大图中进行矩阵切片赋值,实现了图像的随机平移效果。