如何将图像目标2D坐标转换以匹配cv2.INTER_LINEAR双线性插值缩放?
正确的OpenCV resize坐标转换方法
你的问题出在混淆了像素索引坐标和像素中心坐标的区别。OpenCV的cv2.resize(双线性插值)是基于像素中心进行采样映射的,所以要得到原像素中心在缩放后图像中的位置,需要先把像素索引转换为中心坐标再缩放,而不是直接对索引做缩放。
正确转换步骤
对于原图像中像素的索引坐标(y, x)(y是行索引,x是列索引,对应你数组中的[y, x]):
- 先将索引转换为像素中心坐标:
(y + 0.5, x + 0.5)(每个像素是1×1的方块,索引是左上角位置,中心就是索引加0.5) - 对中心坐标应用缩放因子:
- 缩放后的行方向中心坐标:
(y + 0.5) * Sy - 缩放后的列方向中心坐标:
(x + 0.5) * Sx
- 缩放后的行方向中心坐标:
用你的测试案例验证
原坐标数组:
import numpy as np orig_coords = np.array([[0., 0.], [0., 9.], [9., 0.], [9., 9.]]) Sx = 7.7 Sy = 5.5
计算缩放后的中心坐标:
scaled_coords = np.copy(orig_coords) # 处理行方向(数组第一列) scaled_coords[:, 0] = (orig_coords[:, 0] + 0.5) * Sy # 处理列方向(数组第二列) scaled_coords[:, 1] = (orig_coords[:, 1] + 0.5) * Sx
得到结果:
array([[ 2.75, 3.85], [ 2.75, 73.15], [52.25, 3.85], [52.25, 73.15]])
其中右下角的(52.25, 73.15)完全符合你的预期。
为什么你的原方法不对
你之前的平移中心缩放逻辑,是把像素索引当作了像素中心的坐标来计算,相当于假设原像素索引0的中心在0位置,这和实际的像素中心定义不符,所以得到的结果会偏移。只有基于索引+0.5的中心坐标缩放,才符合OpenCV双线性插值的映射逻辑。
内容的提问来源于stack exchange,提问作者topcat
相关产品推荐
相关产品推荐

