如何保持原形状缩放3D numpy数组?求替代裁剪/补零方案
3D数组缩放后保持原形状的解决方案
是否存在优于裁剪/零填充的方案?
目前没有比裁剪或零填充更直接的方案——scipy.ndimage.zoom会严格按照缩放因子计算输出形状,要强制匹配原尺寸,只能通过截断超出部分或补充缺失部分来实现。相对而言,中间裁剪(缩放因子大于1时)和对称零填充(缩放因子小于1时)是比较合理的选择,它们能尽量保留缩放后数据的核心区域,同时保持中心对齐,减少信息偏移。
缩放因子>1时的中间裁剪实现(以缩放因子2为例)
当缩放因子为2时,原形状(240,240,155)会被放大到(480,480,310),我们只需要从放大后的数组中心裁剪出原尺寸即可:
import numpy as np from scipy.ndimage import zoom # 替换为你的实际3D数组 original_arr = np.random.rand(240, 240, 155) zoom_factor = 2 # 执行缩放(order控制插值精度,3为双三次插值,可按需调整) zoomed_arr = zoom(original_arr, zoom_factor, order=3) # 计算每个维度的裁剪起始/结束索引 orig_shape = original_arr.shape zoom_shape = zoomed_arr.shape start_idx = [(z_dim - o_dim) // 2 for z_dim, o_dim in zip(zoom_shape, orig_shape)] end_idx = [s + o for s, o in zip(start_idx, orig_shape)] # 中心裁剪回原尺寸 cropped_arr = zoomed_arr[start_idx[0]:end_idx[0], start_idx[1]:end_idx[1], start_idx[2]:end_idx[2]] # 验证结果形状 print(cropped_arr.shape) # 输出 (240, 240, 155)
缩放因子<1时的零填充实现(以缩放因子0.5为例)
当缩放因子为0.5时,原数组会缩小到(120,120,77),我们需要创建一个和原尺寸相同的零数组,把缩小后的数组放到中心位置:
import numpy as np from scipy.ndimage import zoom # 替换为你的实际3D数组 original_arr = np.random.rand(240, 240, 155) zoom_factor = 0.5 # 执行缩放 zoomed_arr = zoom(original_arr, zoom_factor, order=3) # 计算每个维度的填充量(前后/左右/上下对称填充,剩余1个像素补在末尾) orig_shape = original_arr.shape zoom_shape = zoomed_arr.shape pad_config = [] for o_dim, z_dim in zip(orig_shape, zoom_shape): total_pad = o_dim - z_dim pad_front = total_pad // 2 pad_back = total_pad - pad_front pad_config.append((pad_front, pad_back)) # 零填充并居中 padded_arr = np.pad(zoomed_arr, pad_config, mode='constant', constant_values=0) # 验证结果形状 print(padded_arr.shape) # 输出 (240, 240, 155)
内容的提问来源于stack exchange,提问作者Janikas
相关产品推荐
相关产品推荐

