使用vl_sift算法匹配投影变换图像时如何计算RMSE
投影变换图像对的SIFT匹配RMSE计算方法
你已经提前知道了两张图之间的真实投影变换矩阵,计算匹配RMSE的逻辑非常直接,以下是分步实现方法:
步骤1:提取特征并完成匹配
先用vl_sift算法分别提取两张图的关键点和描述子,完成描述子匹配后通过比值测试、RANSAC等方法过滤外点,得到两组有效匹配点:
- 源图(裁剪后的I1区域)上的匹配点存为
pts1,维度为N×2,每行对应一个点的(x,y)坐标 - 目标图I2上的对应匹配点存为
pts2,维度和pts1一致
注意这里的I2是从I1的[400:800,400:800]区域变换得到的,提取pts1时要直接在该裁剪区域上提取,避免坐标偏移不匹配的问题
步骤2:计算源图匹配点的理论投影坐标
调用你定义的projective2d对象的前向变换方法,把pts1投影到I2的坐标系下,得到无误差的理论匹配坐标:
pts1_proj = transformPointsForward(T, pts1);
步骤3:计算RMSE
用实际匹配点和理论投影点的欧氏距离计算均方根即可:
coord_diff = pts2 - pts1_proj; rmse = sqrt(mean(sum(coord_diff.^2, 2)));
得到的结果单位为像素,数值越小代表匹配精度越高。
补充完整可运行代码
你给出的测试代码可以补充为完整的RMSE计算流程:
% 你的原始测试代码 I1 = imread('filename'); T = projective2d([0.89 1.24 0.002; -0.95 1 0.0025; 0 0 1]); I1_crop = I1(400:800,400:800); I2 = imwarp(I1_crop,T); % 转为灰度图提取SIFT特征 I1_gray = single(rgb2gray(I1_crop)); I2_gray = single(rgb2gray(I2)); [f1, d1] = vl_sift(I1_gray); [f2, d2] = vl_sift(I2_gray); % 特征匹配+比值测试过滤外点 [matches, ~] = vl_ubcmatch(d1, d2, 1.5); pts1 = f1(1:2, matches(1,:))'; pts2 = f2(1:2, matches(2,:))'; % 计算RMSE pts1_proj = transformPointsForward(T, pts1); coord_diff = pts2 - pts1_proj; rmse = sqrt(mean(sum(coord_diff.^2, 2))); disp(['匹配RMSE为:', num2str(rmse), '像素']);
注意事项
- 如果没有提前知道真实投影矩阵,可以先用匹配点对估计出单应矩阵H,再用H投影
pts1得到理论坐标后计算RMSE即可 - 外点过滤是必要步骤,未过滤的外点会大幅拉高RMSE数值,失去参考意义
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

