Python中裁剪480x640图像为195x195后如何缩放对应(68,2)数组值
问题根源
之前编写的代码无法得到预期结果,核心是两个逻辑偏差:
- 把图像整体缩放到目标尺寸的操作逻辑,套用到了固定区域裁剪的坐标变换场景中
- 错误使用两个图像的面积比值(即
(195*195)/(480*640))作为坐标缩放系数。面积比例和坐标的线性变换没有任何对应关系,这也是计算结果完全不符合预期的主要原因
正确的坐标变换逻辑
首先明确两个基础规则:
- 常规图像数组的坐标系原点为图像左上角,x轴对应宽度方向(原图像范围0480),y轴对应高度方向(原图像范围0640)
- 裁剪操作的坐标变换核心是坐标平移,即把裁剪区域的左上角设为新坐标系的原点,不存在全图按面积比例缩放的步骤
第一步:确定裁剪区域的位置
要从480x640的原图中裁出195x195的正方形,首先需要选定裁剪区域在原图上的锚点,计算出裁剪区域的左上角坐标(x_start, y_start):
- 若采用最常用的中心裁剪策略:水平方向裁剪起点为
(480-195)/2 = 142.5,垂直方向裁剪起点为(640-195)/2 = 222.5,对应原图上的裁剪范围为x∈[142.5, 337.5]、y∈[222.5, 417.5] - 若采用左上角裁剪策略:裁剪起点为(0,0),对应原图上的裁剪范围为x∈[0,195]、y∈[0,195]
第二步:对(68,2)的坐标数组做变换
假设shape数组的每一行存储一个点的坐标,格式为[x坐标, y坐标],正确的变换流程如下:
- 坐标平移:将每个点的原坐标减去裁剪区域的左上角偏移量,把裁剪区域对应到新坐标系的原点
- 范围校验:过滤掉变换后坐标超出[0,195]区间的点,这类点原本就落在裁剪时被舍弃的图像区域外
对应中心裁剪的可运行代码示例:
# 原图像参数:宽度480,高度640 ORIGIN_W, ORIGIN_H = 480, 640 # 目标裁剪尺寸 CROP_SIZE = 195 # 计算中心裁剪的偏移量 x_start = (ORIGIN_W - CROP_SIZE) / 2 y_start = (ORIGIN_H - CROP_SIZE) / 2 # shape为维度(68,2)的原坐标数组 # 1. 坐标平移 new_shape = shape - [x_start, y_start] # 2. 过滤落在裁剪区域外的点(可根据业务需求选择是否保留这步) valid_mask = ( (new_shape[:, 0] >= 0) & (new_shape[:, 0] < CROP_SIZE) & (new_shape[:, 1] >= 0) & (new_shape[:, 1] < CROP_SIZE) ) valid_coords = new_shape[valid_mask]
补充说明:如果你的操作不是直接从原图裁剪,而是先把原图整体缩放到指定尺寸再裁出195x195的区域,才需要引入单维度的缩放系数:x方向缩放系数为
195/480,y方向缩放系数为195/640,先乘对应方向的缩放系数、再做裁剪偏移即可,依然不需要用到两个图像的面积比值。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

