如何确定cv2.resize操作后原图像像素在缩放图中的对应坐标
OpenCV cv2.resize像素坐标映射解决方案
核心映射规则(适配宽高比变化场景)
cv2.resize的坐标映射逻辑与插值类型无关,插值仅用于计算目标像素的颜色值,坐标换算规则统一,完全支持非等比缩放场景:
首先明确几个参数定义:
- 原图尺寸:
src_h(高度)、src_w(宽度) - 缩放后目标尺寸:
dst_h、dst_w - 原图像素坐标:
(src_x, src_y),x为水平方向坐标,y为垂直方向坐标 - 对应缩放后坐标:
(dst_x, dst_y)
通用换算公式
OpenCV默认将像素整数坐标视为像素左上角位置,实际像素中心位置需偏移0.5个像素单位,因此通用映射公式为:
dst_x = (src_x + 0.5) * (dst_w / src_w) - 0.5 dst_y = (src_y + 0.5) * (dst_h / src_h) - 0.5
该公式无需考虑宽高比是否变化,x、y轴独立计算即可。如果不需要亚像素级精度,可对结果取整:单像素点取最近整数, bounding box 左上角向下取整、右下角向上取整即可保证原区域完整覆盖。
示例计算
以你提到的原图坐标(785, 251)为例,假设原图尺寸为1000x800(宽1000,高800),非等比缩放到500x600:
- 计算x轴缩放系数:
500 / 1000 = 0.5 - 计算y轴缩放系数:
600 / 800 = 0.75 - 目标x坐标:
(785 + 0.5) * 0.5 - 0.5 = 392.25 - 目标y坐标:
(251 + 0.5) * 0.75 - 0.5 = 188.125
直接通过OpenCV获取映射表的方法
如果需要批量生成所有像素的映射关系,可以通过坐标图缩放的方式直接获取,避免手动计算出错:
- 生成两张和原图尺寸一致的单通道浮点图,
map_x每个位置的值等于自身x坐标,map_y每个位置的值等于自身y坐标 - 对
map_x和map_y使用和图像缩放完全一致的参数(目标尺寸、插值方式、所有flags)调用cv2.resize - 缩放后的
map_x、map_y中,(i,j)位置的值就是缩放后图像(i,j)坐标对应的原图x、y坐标;如果需要原图到目标的映射,反向生成目标尺寸的坐标图缩放到原图尺寸即可。
Bounding box适配方案
直接对原bbox的左上角(x1,y1)和右下角(x2,y2)分别调用上述映射公式计算得到新的(x1', y1')、(x2', y2'),即可得到和原区域完全对应的缩放后bbox,不受宽高比变化影响。
内容的提问来源于stack exchange,提问作者PeterQuando
相关产品推荐
相关产品推荐

