图像缩放后使用warpAffine前是否需调整变换矩阵M的技术咨询
图像缩放后使用warpAffine前是否需调整变换矩阵M的技术咨询
Hey Igor,你的问题戳中了很多人用特征匹配+仿射变换时容易踩的坑——没错,你必须要调整变换矩阵M之后才能用在原图上!
先帮你理清楚问题出在哪:你现在用的mkpts0和mkpts1是从缩放后的小图(1080x720)里提取的匹配点,它们的坐标是基于小图尺度的,但你要做变换的是原始的大图(5k×3k)。直接用小图上算出的M去 warp 原图,相当于把小图的变换尺度直接套在大图上,结果肯定会偏移、变形,自然效果差。
给你具体的解决步骤,直接套到你的代码里就行:
第一步:计算原图与缩放后图像的比例
先算出x、y方向的缩放比例(原图尺寸 ÷ 缩放后小图尺寸):# 计算x、y方向的缩放比例(原图/缩放后图) scale_x = img0.shape[1] / image0.shape[1] scale_y = img0.shape[0] / image0.shape[0]第二步:调整变换矩阵M
仿射变换矩阵M是2×3的结构,形式为[[a, b, tx], [c, d, ty]]:前两列是旋转、缩放这类线性变换,第三列是平移。我们需要把小图的变换尺度映射回原图尺度:# 复制原矩阵避免修改原始数据 M_adjusted = M.copy() # 调整线性变换部分:分别乘以x、y方向的缩放比例 M_adjusted[0, 0] *= scale_x M_adjusted[0, 1] *= scale_x M_adjusted[1, 0] *= scale_y M_adjusted[1, 1] *= scale_y # 调整平移部分:同样乘以对应缩放比例 M_adjusted[0, 2] *= scale_x M_adjusted[1, 2] *= scale_y第三步:用调整后的矩阵执行warpAffine
把原来的M替换成调整后的M_adjusted,再做 warp 操作:result = cv2.warpAffine(img0, M_adjusted, (img1.shape[1], img1.shape[0]), cv2.INTER_NEAREST_EXACT)
给你个小验证技巧:找一对匹配点,比如小图上的mkpts0[0],对应原图的坐标是(mkpts0[0][0]*scale_x, mkpts0[0][1]*scale_y),用调整后的M变换这个原图点,结果应该和mkpts1[0]缩放回原图的坐标基本一致(考虑RANSAC的误差),这样就能确认矩阵调整是否正确。
备注:内容来源于stack exchange,提问作者Igor Dalavechia
相关产品推荐
相关产品推荐

