You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将图像目标2D坐标转换以匹配cv2.INTER_LINEAR双线性插值缩放?

正确的OpenCV resize坐标转换方法

你的问题出在混淆了像素索引坐标和像素中心坐标的区别。OpenCV的cv2.resize(双线性插值)是基于像素中心进行采样映射的,所以要得到原像素中心在缩放后图像中的位置,需要先把像素索引转换为中心坐标再缩放,而不是直接对索引做缩放。

正确转换步骤

对于原图像中像素的索引坐标(y, x)(y是行索引,x是列索引,对应你数组中的[y, x]):

  1. 先将索引转换为像素中心坐标:(y + 0.5, x + 0.5)(每个像素是1×1的方块,索引是左上角位置,中心就是索引加0.5)
  2. 对中心坐标应用缩放因子:
    • 缩放后的行方向中心坐标:(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:13:16