CT图像使用transforms.Normalize()函数的计算过程

利用pytorch对CT图像做深度学习的时候需要使用pytorch的图像处理的工具包transform,但是我看在CT图像上通常使用的是transform.ToTensor()将图像转换到[0,1],自然图像常常会使用transforms.Normalize()来将图像转换到[-1,1],对此查询了一下CT图像是否需要使用transforms.Normalize()很少有资料,抱着试一试的心态,自己钻研了一下怎么来使用这个函数

在此如果有人比较了解CT图像是否需要Normalize请指正。

网上查到的方法对transforms.Normalize()应用需要先使用transform.ToTensor()将图像转换到[0,1],然后再根据数据集的mean,std分别对数据集进行Normalize();

以下是计算我的数据集的mean,std的代码:

from torchvision.transforms import ToTensor
import numpy as np
from PIL import Image
import tqdm
import os
import torch

img_dir = "./training_dataset/"   #数据集路径
    # 使用assert 判断数据集路径是否存在,若存在程序继续向下执行,若不存在,最抛出异常:“image dir: '{img_dir}' does not exist.”
assert os.path.exists(img_dir), f"image dir: '{img_dir}' does not exist." 

img_name_list=[]

for root ,sub, files in os.walk(img_dir):  #遍历数据集
    #print(os.path.splitext(os.path.basename(root)))
    want_pngs = ['DegradePhase1','DegradePhase2','DegradePhase3','DegradePhase4',  #筛选自己需要的数据集
           'DegradePhase5','DegradePhase6','DegradePhase7','DegradePhase8','DegradePhase9','DegradePhase10']
    for want_png in want_pngs:
        if want_png in os.path.splitext(os.path.basename(root)):
                print('OK')
                for file in files:
                        if file.endswith(".png"):
                                file_name = os.path.join(root, file)
                                img_name_list.append(file_name)


print(len(img_name_list)) #总共25080张png图片 ,DegradePhase相关的图片11400张
cumulative_mean = torch.zeros(1)  #CT图像是单通道,所以最后指建了一维tensor
cumulative_std = torch.zeros(1)
x_transform = ToTensor()          #normalize之前需要ToTensor
print(f"INFO: {len(img_name_list)} imgs in total")
for img_name in tqdm.tqdm(img_name_list,total=len(img_name_list)): 
        
        img = np.array(Image.open(img_name))   #打开图像
        img = x_transform(img)                 #转化成tensor并归一到[0,1]
        C,H,W = img.shape[:3]                  #获取通道C,高H,宽W
        img = img.view(C,-1)                   #将H,展平
        #print(img.shape,img.dtype)
        #print(img.mean())
    
        cumulative_mean += img.mean(1)   # 分别将将所有图片的每一个通道的值求均值再求和
        cumulative_std += img.std(1)     #分别将将所有图片的每一个通道的值求均标准差再求和

mean = cumulative_mean / len(img_name_list)
std = cumulative_std / len(img_name_list)
print(f"总数据量:{len(img_name_list)}")
print(f"mean: {mean}")
print(f"std: {std}")

最后输出:

ps:注意如果训练的时候改写transform的话,利用训练好的模型做预测的使用也需要使用与训练时一样的transform,不然会的到非常奇怪的结果

猜你喜欢

转载自blog.csdn.net/zlbbme/article/details/128927059