导出 NIfTI 体积切片的 Python 代码会产生亮度不连贯的图像

问题描述 投票:0回答:1

我是 MRI 和 Python 的初学者。 我正在尝试从 .nii.gz 文件导出切片图像。

我让 ChatGPT 帮我写下这个示例代码。该代码根据需要存储三个平面上的切片图像。 我无法解决的问题是,不同的 .nii.gz 文件会导致切片图像具有不同且不连贯的亮度级别。

亮度一致的切片图像集

亮度不相干的切片图像集#1

亮度不相干的切片图像集#2

这些目录屏幕截图显示了每个图像如何具有不同的亮度级别。一些 .nii.gz 文件提供所有切片之间具有正确且一致的亮度的图像。其他没有。

这是我从 ChatGTP 获得的代码:

import nibabel as nib
import matplotlib.pyplot as plt
import os
import numpy as np

def save_slices(volume, plane_name, axis, output_dir):
os.makedirs(output_dir, exist_ok=True)
for i in range(volume.shape[axis]):
if axis == 0:
slice_img = volume[i, :, :]
elif axis == 1:
slice_img = volume[:, i, :]
elif axis == 2:
slice_img = volume[:, :, i]

        # Normalize the slice image
        slice_img = (slice_img - np.min(slice_img)) / (np.max(slice_img) - np.min(slice_img)) * 255
        slice_img = slice_img.astype(np.uint8)
    
        plt.imshow(slice_img.T, cmap='gray', origin='lower')
        plt.axis('off')
        plt.savefig(os.path.join(output_dir, f"{plane_name}_slice_{i:03d}.png"), bbox_inches='tight', pad_inches=0)
        plt.close()

# Load the NIfTI file

nifti_file = '../dataset/raw/HUMAN/UCSF-PDGM-v3/UCSF-PDGM-0005_nifti/UCSF-PDGM-0005_DTI_eddy_L2.nii.gz'
nifti_img = nib.load(nifti_file)
volume = nifti_img.get_fdata()

# Define output directories

output_dirs = {
'axial': 'output/axial',
'coronal': 'output/coronal',
'sagittal': 'output/sagittal'
}

# Save slices for each plane

save_slices(volume, 'axial', 2, output_dirs['axial'])
save_slices(volume, 'coronal', 1, output_dirs['coronal'])
save_slices(volume, 'sagittal', 0, output_dirs['sagittal'])

出了什么问题?

谢谢大家的帮助!

python export brightness nifti mri
1个回答
0
投票

找到答案了。

首先,我没有取全局体积最小值,而是取切片最小值。

其次,某些扫描可能存在极暗的异常值(即快速采集产生的伪影)。 这些离群值抵消了从切片中减去全局最小值的效果。 减去基于百分位数的最小值(即 0.05)而不是绝对最小值,可以正确恢复整组切片图像的亮度。

© www.soinside.com 2019 - 2024. All rights reserved.