如何手动对RGB图像执行逐通道归一化?
手动实现RGB图像逐通道归一化
你的代码报错是因为numpy广播机制要求操作数的维度能对应匹配:图像形状是(3,512,512)(通道在前),而mean和std是(3,),两者维度不匹配,无法直接完成广播计算。
解决方法很简单,只需把mean和std的形状扩展为(3,1,1),让它们能和每个通道的所有像素一一对应,具体修改如下:
import numpy as np from PIL import Image img_name = 'example/abc/myfile.png' img = np.asarray(Image.open(img_name)) img = np.transpose(img, (2,0,1)) # 转为(通道, 高, 宽)格式 # 扩展mean和std的维度,从(3,)变成(3,1,1) mean = mean.reshape(3, 1, 1) std = std.reshape(3, 1, 1) # 现在可以正常执行逐通道归一化 normalized_img = (img / 255.0 - mean) / std
也可以用np.expand_dims实现维度扩展,效果完全一致:
mean = np.expand_dims(mean, axis=(1,2)) std = np.expand_dims(std, axis=(1,2))
补充说明
如果保留PIL默认的(高, 宽, 通道)图像格式(不转置),只需把mean和std扩展为(1,1,3),同样能完成逐通道归一化:
img = np.asarray(Image.open(img_name)) # 形状(512,512,3) mean = mean.reshape(1,1,3) std = std.reshape(1,1,3) normalized_img = (img / 255.0 - mean) / std
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

