如何使用torch.tensor重塑二维数组 实现32*32图像降分辨率至16*16
PyTorch实现32×32张量降分辨率为16×16的可行方案
注意:直接调用reshape/view修改张量尺寸无法实现降分辨率效果,这类操作只会硬打乱像素的原有排布,输出结果完全不保留原图的视觉结构,不能用于图像分辨率调整。真正的降分辨率需要对相邻像素做下采样聚合,以下是三种可直接落地的实现方式:
平均池化下采样(最通用)
把原图按2×2大小的无重叠窗口切分,每个窗口内的像素取平均值作为输出图对应位置的像素值,降采样效果平滑自然,是最常用的图像降分辨率方案。
单张二维图像张量的实现代码:import torch # 示例:生成随机32×32张量模拟输入图像 img_32 = torch.rand(32, 32) # 补批量、通道维度适配池化接口要求,池化核与步长均设为2,处理后去掉多余维度 img_16 = torch.nn.functional.avg_pool2d( img_32.unsqueeze(0).unsqueeze(0), kernel_size=2, stride=2 ).squeeze() print(img_16.shape) # 输出为torch.Size([16, 16])如果输入是批量多通道格式的张量(形状为
[批量数, 通道数, 32, 32]),直接传入池化接口即可,不需要额外加维度。最大池化下采样
每个2×2窗口内取最大像素值作为输出,适合需要保留高亮特征、强边缘信息的场景,代码逻辑和平均池化一致:img_16_max = torch.nn.functional.max_pool2d( img_32.unsqueeze(0).unsqueeze(0), kernel_size=2, stride=2 ).squeeze()近邻下采样(速度最快)
不需要做数值聚合计算,直接按步长2隔行隔列取像素点生成新图,运行速度最快,但降采样后可能出现明显锯齿:img_16_near = img_32[::2, ::2] print(img_16_near.shape) # 输出为torch.Size([16, 16])
补充:如果需要用插值类的降采样效果(比如双线性插值),可以调用
torch.nn.functional.interpolate接口,设置scale_factor=0.5、mode='bilinear'即可,注意调用前同样需要补全批量、通道维度。
内容的提问来源于stack exchange,提问作者Jinsu Jang
相关产品推荐
相关产品推荐

