raw 存储的是一个3D的CT影像,mhd 文件存储的是相应 raw 文件的信息
我的数据集train/low dose
文件夹下内容如下,mhd 和 raw同在一个文件夹下:
使用 SimpleITK 库进行mhd和raw文件的读取
import os
from tqdm import tqdm
import SimpleITK as sitk
import matplotlib.pyplot as plt
def slice(ori_path: str, pro_path: str):
for path in os.listdir(ori_path):
if path.find('mhd') >= 0:
data_mhd = sitk.ReadImage(os.path.join(ori_path, path))
spacing = data_mhd.GetSpacing()
scan = sitk.GetArrayFromImage(data_mhd)
for i in tqdm(range(len(scan))):
plt.figure()
plt.imshow(scan[i], cmap=plt.cm.bone)
plt.show()
break # 这里只是演示切片后效果,所以用了break,正常遍历的话直接删掉break就行
调用:
low_dose_path = 'train/low dose' # 原数据集路径
low_dose_slice_path = 'train_slice/low_dose_slice' # 保存路径
slice(low_dose_path, low_dose_slice_path)
def slice(ori_path: str, pro_path: str):
id = 0
for path in os.listdir(ori_path):
if path.find('mhd') >= 0:
id += 1
save_content = os.path.join(pro_path, str(id))
if os.path.exists(save_content):
shutil.rmtree(save_content)
os.makedirs(save_content)
data_mhd = sitk.ReadImage(os.path.join(ori_path, path))
spacing = data_mhd.GetSpacing()
scan = sitk.GetArrayFromImage(data_mhd)
for i in tqdm(range(len(scan))):
img = cv2.normalize(scan[i], None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
img = Image.fromarray(img)
save_path = os.path.join(save_content, f'{id}_{i}.png')
img.save(save_path)
说明:
我的数据集中3D影像的像素值是 -3000 到 3000 多,而我们正常的图像都是0-255的,因此最好的办法就是使用cv2.normalize
归一化到0-255之间,然后再保存。
如果是自己写一个归一化的代码,或者使用from sklearn.preprocessing import minmax_scale
的这个minmax_scale
函数,会出现一些奇怪的问题,我猜测可能是这样归一化时的损失很大,所以会出现一些问题。
调用同上:
low_dose_path = 'train/low dose' # 原数据集路径
low_dose_slice_path = 'train_slice/low_dose_slice' # 保存路径
slice(low_dose_path, low_dose_slice_path)