nii转dicom + dicom调窗 + dicom转png

******************************************深度学习模型输入转换******************************************

import cv2
import pydicom
import SimpleITK
import numpy as np
from PIL import Image

 以下转换等价:

im0 = cv2.imread(path)

image = Image.fromarray(img).convert('RGB')
image = np.array(image)

image = Image.open(path).convert('RGB') 
image = np.array(image)

# 法一(不调窗):
img = pydicom.dcmread(path)
img = img.pixel_array
img = (img - img.min()) / (img.max() - img.min())
img = (255 * img).clip(0, 255).astype(np.uint8)

image = Image.fromarray(img).convert('RGB')
image = np.array(image)

# 法2(min+max):
min_bound = -60
max_bound = 140
image = SimpleITK.ReadImage(path)
img_array = SimpleITK.GetArrayFromImage(image)
img_array = np.clip((img_array[0] - min_bound) / (max_bound - min_bound), 0, 1)
img = (img_array * 255).clip(0, 255).astype(np.uint8)

image = Image.fromarray(img).convert('RGB')
image = np.array(image)

# 法3(ww+wl):
img = pydicom.dcmread(path)
img = adjust_window(get_pixeldata(img)[0], 200, 40, get_pixeldata(img)[1], get_pixeldata(img)[2])

image = Image.fromarray(img).convert('RGB')
image = np.array(image)

一、nii转dicom:

import SimpleITK as sitk
import os
import time
from glob import glob
from tqdm import tqdm

class NiftiToDicomConverter:
    def __init__(self):
        pass

    @staticmethod
    def writeSlices(base_filename, series_tag_values, new_img, i, out_dir):
        image_slice = new_img[:, :, i]
        img_np = sitk.GetArrayFromImage(image_slice)

        rescaler = sitk.RescaleIntensityImageFilter()
        rescaler.SetOutputMinimum(int(img_np.min()))
        rescaler.SetOutputMaximum(int(img_np.max()))
        image_slice = rescaler.Execute(image_slice)

        image_slice = sitk.Cast(image_slice, sitk.sitkInt16)

        writer = sitk.ImageFileWriter()
        writer.KeepOriginalImageUIDOn()

        list(map(lambda tag_value: image_slice.SetMetaData(tag_value[0], tag_value[1]), series_tag_values))

        image_slice.SetMetaData("0008|0012", time.strftime("%Y%m%d"))
        image_slice.SetMetaData("0008|0013", time.strftime("%H%M%S"))

        image_slice.SetMetaData("0008|0060", "CT")
        image_slice.SetMetaData("0020|0032", '\\'.join(
            map(str, new_img.TransformIndexToPhysicalPoint((0, 0, i))))
        )
        image_slice.SetMetaData("0020|0013", str(i))
        image_slice.SetMetaData("0010|0010", "Nifti2Dicom")

        writer.SetFileName(os.path.join(out_dir, base_filename + '_z_slice_' + str(i).zfill(3) + '.dcm'))
        writer.Execute(image_slice)

    def nifti2dicom_1file(self, in_dir, out_dir):
        os.makedirs(out_dir, exist_ok=True)
        base_filename = os.path.basename(in_dir).replace('.nii', '').replace('.gz', '')

        new_img = sitk.ReadImage(in_dir)
        modification_time = time.strftime("%H%M%S")
        modification_date = time.strftime("%Y%m%d")

        study_uid = "1.2.826.0.1.3680043.2.1125.1.59201697652405021022624652050109009"
        series_uid = "1.2.826.0.1.3680043.2.1125.1.10417354219310089004977598540239149"

        direction = new_img.GetDirection()
        series_tag_values = [("0008|0031", modification_time),
                             ("0008|0021", modification_date),
                             ("0008|0008", "DERIVED\\SECONDARY"),
                             ("0020|000d", study_uid if study_uid else "1.2.826.0.1.3680043.2.1125." + modification_date + ".1" + modification_time),
                             ("0020|000e", series_uid if series_uid else "1.2.826.0.1.3680043.2.1125." + modification_date + ".1" + modification_time),
                             ("0020|000e", "1.2.826.0.1.3680043.2.1125." + modification_date + ".1" + modification_time),
                             ("0020|0037", '\\'.join(
                                 map(str, (direction[0], direction[3], direction[6],
                                           direction[1], dir
### 将NII文件换为DICOM格式的方法 #### 使用Python脚本实现NIIDICOM换 可以利用开源库 `pydicom` 和 `nibabel` 来完成这一任务。这些库提供了读取和写入医学图像的能力,从而能够轻松地将 NIfTI 文件中的数据映射至 DICOM 格式的结构中[^1]。 以下是基于 Python 的一种常见实现方式: ```python import nibabel as nib import pydicom from pydicom.dataset import Dataset, FileDataset import numpy as np def create_dicom_from_nifti(nifti_file_path, dicom_output_dir): # 加载NIfTI文件 nii_img = nib.load(nifti_file_path) data = nii_img.get_fdata() # 获取像素数据 # 创建一个新的DICOM对象 file_meta = Dataset() ds = FileDataset(None, {}, file_meta=file_meta, preamble=b"\0" * 128) # 设置基本DICOM标签 ds.Modality = "MR" ds.SeriesInstanceUID = pydicom.uid.generate_uid() ds.StudyInstanceUID = pydicom.uid.generate_uid() ds.SOPClassUID = "1.2.840.10008.5.1.4.1.1.4" # 遍历每一层切片并保存为单独的DICOM文件 for i in range(data.shape[2]): slice_data = data[:, :, i] # 更新具体的数据字段 ds.InstanceNumber = i + 1 ds.Rows, ds.Columns = slice_data.shape ds.PixelData = slice_data.tobytes() # 构建输出路径 output_filename = f"{dicom_output_dir}/image_{i}.dcm" # 保存DICOM文件 pydicom.filewriter.dcmwrite(output_filename, ds) create_dicom_from_nifti('input.nii', 'output_dcms') ``` 上述代码展示了如何通过加载 `.nii` 文件并将其中的三维体素数据逐一切片存储成标准的 DICOM 图像文件来完成整个过程。 #### 已有的工具支持 除了手动编写脚本外,还有现成的工具可以帮助简化此操作。例如,在 GitHub 上有一个项目名为 **nii_to_RTSTRUCT** 提供了一个 Docker 容器环境下的解决方案用于此类化工作。该项目不仅实现了基础的功能还考虑到了更复杂的场景比如 RT 结构集生成等问题。 另外还可以尝试其他成熟的软件包如 dcmqi (https://github.com/QIICR/dcmqi),它专门设计用来处理各种医疗影像之间的相互变需求,并且具有良好的社区文档和支持体系可供查阅学习。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值