医学图像处理3:nii.gz转换为png图像需要考虑窗宽窗位吗?

发布于:2024-12-06 ⋅ 阅读:(24) ⋅ 点赞:(0)

医学图像处理3:nii.gz转换为png图像需要考虑窗宽窗位吗?

不知道大家在使用python转换nii.gz 文件的过程中是否遇到过这样的问题:

之前在3DSlice上设置好窗宽窗位后保存的nii,但是转换为png后,图像显示的结果好像还是肺窗。并不是自己想要的软组织窗,或者是骨窗。

我自己在转换的过程中,原本为了方便,但是转换后显示的结果和自己想要的并不相同,并没有转换为自己想要的软组织窗。查阅资料发现,CT图像在转换过程中因为涉及到HU的转换,所以,想要查看不同窗的图像都需要先转化,所以有了这篇文章。

窗宽窗位的设置

在查资料的过程中也找到了窗宽窗位的设置指南:如下

在这里插入图片描述

使用python将nii.gz转换为png(设置窗宽窗位)

数据准备和需要的包,同之前篇:医学图像处理1:将nii.gz转换为png图像

import os
import numpy as np
import nibabel as nib  # 一般处理nii都需要这个包

def AdjustWidthHeight(nii_data, w_width, w_center):
	# 设置窗宽窗位
    val_min = w_center - (w_width / 2)
    val_max = w_center + (w_width / 2)
    data_adjusted = nii_data.copy()
    data_adjusted[nii_data < val_min] = val_min
    data_adjusted[nii_data > val_max] = val_max
    return data_adjusted

def Nii2pngWithWidthHeight(input_folder, output_folder):
    os.makedirs(output_folder, exist_ok=True)
    # 遍历输入文件夹中的每个 .nii.gz 文件
    for nii_file_name in os.listdir(input_folder):
        try:
            if nii_file_name.endswith('.nii.gz'):
                save_filename = os.path.join(output_folder, nii_file_name[:-7])
                if os.path.exists(save_filename):
                    pass
                else:
                    os.makedirs(save_filename, exist_ok=True)

                nii_file_path = os.path.join(input_folder, nii_file_name)

                # 加载 .nii.gz 文件
                nii_image = nib.load(nii_file_path)
                # header = nii_image.header
                # print(header)
                nii_data = nii_image.get_fdata()
                nii_data = nii_data.transpose((1, 0, 2))
                nii_data_adjust = AdjustWidthHeight(nii_data, w_width=400, w_center=50)
                # 将NIfTI数据转换为PNG图像并保存在输出子文件夹中
                for slice_idx in range(nii_data_adjust.shape[2]):  # 以哪个方向做切片,0[-3]为长,1[-2]为宽,2[-1]为高(具体情况,具体分析)
                    try:
                        slice_data = nii_data_adjust[..., slice_idx]  # 根据切割方向不同设置数据列表(此为shape[-1])
                        # slice_data = nii_data[slice_idx, ...]  # 根据切割方向不同设置数据列表(此为shape[0])
                        slice_data_normalized = ((slice_data - np.min(slice_data)) / (
                                np.max(slice_data) - np.min(slice_data))) * 255  # 数据标准化((x-min)/(max-min))*255
                        slice_data_normalized = slice_data_normalized.astype(np.uint8)
                        png_image = Image.fromarray(slice_data_normalized, mode='L')  # 将图像转换为灰度作为输出
                        png_file_path = os.path.join(save_filename,
                                                     "{:0>3}".format(str(slice_idx + 1)) + ".png")  # image切片命名
                        png_image.save(png_file_path)
                    except Exception as e:
                        print(nii_file_name, slice_idx, e)
        except Exception as e:
            print(nii_file_name, e)
    return None

if __name__ == '__main__':
	# main 调用
    input_folder = rf'E:\Sci-Python\PGT\data_niigz'  # 输入.nii.gz文件夹路径
    output_folder = rf'E:\Sci-Python\PGT\data_png'  # 输出.png文件夹路径
    Nii2pngWithWidthHeight(input_folder,output_folder)

好啦,就这些啦,欢迎评论区讨论!


网站公告

今日签到

点亮在社区的每一天
去签到