图像裁剪并缩放至256x256后,求解Bounding Box内点的新坐标
解决Bounding Box裁剪缩放后的坐标转换问题
看起来你在处理图像裁剪缩放时遇到了坐标点转换的偏差问题——红色是正确坐标,蓝色是当前计算出的错误结果,我来帮你梳理下问题所在并给出修复方案。
首先,先分析你给出的代码片段里的明显问题:
import numpy as np import cv2 def scaleBB(bb, scale): centerX = (bb[0][0] + bb[1][0]) / 2 centerY = (bb[0][1] + bb[2][1]) / 2 center = (cen...
这里centerY的计算用到了bb[2][1],如果你的Bounding Box是用两个对角点(比如[(x1,y1), (x2,y2)])表示的话,索引2会直接越界;就算BB是四个顶点的列表,基于中心点缩放的思路也不符合裁剪后坐标转换的逻辑——我们需要的是点相对于BB左上角的相对位置缩放,而不是基于中心点。
正确的坐标转换步骤
要把原BB内的点转换到裁剪并缩放到256x256的图像中,应该遵循这几步:
- 计算原Bounding Box的左上角坐标和宽高
- 把原坐标点转换为相对于BB左上角的偏移量
- 根据BB的原始尺寸和目标256x256的尺寸,计算x、y方向的缩放比例
- 用偏移量乘以对应缩放比例,得到新图像中的坐标
修正后的完整代码
import numpy as np import cv2 def convert_original_points_to_cropped(original_points, bbox, target_size=(256, 256)): # 假设bbox格式为 (xmin, ymin, xmax, ymax) —— 这是最常用的BB表示方式 xmin, ymin, xmax, ymax = bbox # 计算原BB的宽高 bbox_width = xmax - xmin bbox_height = ymax - ymin # 计算x、y方向的缩放比例(因为要拉伸到256x256,两个方向比例可能不同) scale_x = target_size[0] / bbox_width scale_y = target_size[1] / bbox_height # 逐个转换坐标点 converted_points = [] for (x, y) in original_points: # 计算点相对于BB左上角的偏移 x_offset = x - xmin y_offset = y - ymin # 缩放得到新图像中的坐标 new_x = x_offset * scale_x new_y = y_offset * scale_y converted_points.append((round(new_x), round(new_y))) # 可选:转成整数像素坐标 return np.array(converted_points) # 示例使用 if __name__ == "__main__": # 原图像的Bounding Box(替换成你实际的BB值) original_bbox = [80, 120, 480, 520] # 原BB内的标记点(替换成你的实际坐标) original_points = [(120, 180), (250, 300), (400, 450)] # 转换坐标 cropped_points = convert_original_points_to_cropped(original_points, original_bbox) print("转换后的坐标:", cropped_points)
关键说明
- 如果你的Bounding Box是用其他格式表示的(比如四个顶点列表
[(x0,y0), (x1,y1), (x2,y2), (x3,y3)]),只需要先提取出xmin(所有x的最小值)、ymin(所有y的最小值)、xmax(所有x的最大值)、ymax(所有y的最大值)即可。 - 如果你需要保持BB的宽高比例再缩放(而不是强制拉伸到256x256),逻辑会稍有不同,但根据你的需求描述,应该是强制缩放到256x256,所以上面的代码完全适用。
内容的提问来源于stack exchange,提问作者SaifDeen
相关产品推荐
相关产品推荐

