读取mhd、raw图像并切片、归一化、保存

这篇博客介绍了如何使用SimpleITK库读取和处理mhd与raw格式的CT影像数据。首先,通过读取mhd文件获取影像信息,并进行切片显示。然后,对像素值进行归一化处理,将其范围从-3000到3000多转换为0-255,以便于保存为.png格式。博主建议使用cv2.normalize而非其他归一化方法,因为可能存在精度损失。最后,将处理后的切片保存为图片文件。
摘要由CSDN通过智能技术生成

前言

raw 存储的是一个3D的CT影像,mhd 文件存储的是相应 raw 文件的信息

我的数据集train/low dose文件夹下内容如下,mhd 和 raw同在一个文件夹下:
在这里插入图片描述

读取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函数,会出现一些奇怪的问题,我猜测可能是这样归一化时的损失很大,所以会出现一些问题。
  有关spacing的问题,由于我这个数据集水平面切片不受影响,所以这个参数没什么影响,也就没用这个参数,相关具体的内容可以查看:医疗影像处理入门篇读入*.mhd数据&解析ElementSpacing参数

调用同上:

low_dose_path = 'train/low dose'  # 原数据集路径
low_dose_slice_path = 'train_slice/low_dose_slice'  # 保存路径
slice(low_dose_path, low_dose_slice_path)

保存效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friedrichor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值