医学图像处理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)
好啦,就这些啦,欢迎评论区讨论!