我在看小土堆的视频的时候发现它在Normalize()中的参数都是0.5,于是我自己用python写了一段代码自己计算了一下一张手机拍摄的普通的照片的标准差和均值,以下是源代码,代码的每一步都写好了
?
这里讲一下思路,就是将一张图片先用PIL打开,然后转化成数组类型。然后用shape方法获得遍历的次数,通过数组的切片获得每一个通道的矩阵,注意这里的普通的图片的通道是在最后面的用shape查看,tensor类型的通道是在最前面的用size查看,切片之后,储存在字典里面,key值是遍历的次数,value是数组矩阵,这里为什么选用字典而不是列表储存是因为,列表中如果储存了列表是没法通过索引列表的下标将列表中的储存的列表索引出来的,然后就是,np的std方法是不支持给tensor类型的数据计算标准差的,但是python中的自带的mean方法是可以计算tensor类型的数据的
from torchvision import transforms
from PIL import Image
import numpy as np
class Get_picture_value():
def __init__(self,path):
self.path=path#导入图片路径
self.image=Image.open(self.path)#打开图片
self.images=np.array(self.image)#将图片转化为数组
def get_picture_tensor(self):
t=transforms.ToTensor()
print("获得图片了")
arr_shapes=self.images.shape[2]#获得遍历数值
shapes={}
tensor_shapes={}
for i in range(arr_shapes):#索引出每个图片的维度的值,用于遍历,将图片的每个矩阵拿出来,并保存在字典
shapes[i]=self.images[:,:,i]
for i in shapes:
tensor_shapes[i]=t(shapes.get(i))
return tensor_shapes
#计算平均值
def get_mean(self,tensor_shapes):
means=[]
for i in pic:
a=tensor_shapes.get(i).mean()#mean方法可以直接用于tensor类型数据的计算
means.append(a)
print("获得平均值了")
return means
#计算标准差
def get_std(self,tensor_shapes):
stds=[]
for i in tensor_shapes:#np的std方法不支持计算tensor类型数据,所以要妆化为数组类型
a=np.array(pic.get(i))
a1=np.std(a)
stds.append(a1)
print("获得标准差了")
return stds
img_path="C:/Users/19940/Desktop/efc935605ca1f9e27d24445752b1071.jpg"
g=Get_picture_value(img_path)
tensor_picture=g.get_picture_tensor()
means=g.get_mean(tensor_picture)
stds=g.get_std(tensor_picture)
print("平均值是:",means,"\n","标准差是:",stds)
运行结果
获得图片了
获得平均值了
获得标准差了
平均值是: [tensor(0.6895), tensor(0.6893), tensor(0.6939)]
标准差是: [0.23430397, 0.22955546, 0.23049147]
?
?