1

我有一些脑部 MRI 扫描的 3D Niftii 数据集(FLAIR、T1、T2、..)。例如,FLAIR 扫描为 144x512x512,体素大小为 1.1、0.5、0.5,我想从轴向、冠状和矢状视图获得 2D 切片,我将其用作 CNN 的输入。

我想做的事:用 nibabel 读入 .nii 文件,将它们保存为 Numpy 数组,并将轴向、冠状和矢状的切片存储为 2D-PNG。

我尝试了什么:

- 使用 med2image python 库

- 使用 nibabel、Numpy 和 image 编写了自己的 python 脚本

问题:轴向和冠状图像以某种方式向一个方向拉伸。矢状面的效果应该很好。

我尝试调试 python 脚本并使用 Matplotlib 来显示我得到的数组,之后

image = nibabel.load(inputfile)
image_array=image.get_fdata()

通过使用例如:

plt.imshow(image_array[:,:, 250])
plt.show()

并发现,数据已经延伸到那里。

我可以弄清楚获得所需的输出

header = image.header
sX=header['pixdim'][1]
sY=header['pixdim'][2]
sZ=header['pixdim'][3]
plt.imshow(image_array[:,:, 250],aspect=sX/sZ)

但是如何在保存图像时应用“方面”之类的东西?或者是否有可能已经加载带有类似参数的 .nii 文件,以获得我可以使用的数据?

看起来,当 nibabel 加载 .nii 图像时,像素尺寸没有得到照顾。但不幸的是,我没有办法解决这个问题..

4

1 回答 1

0

我发现,无论图片是否被拉伸,训练我的 ML 模型并没有什么不同,因为我也在数据增强中这样做。正如预期的那样,在 Slicer 或 MRICroGL 中打开漂亮的卷会显示卷,因为这些程序也考虑了 Header。而且预测也非常好(即使图片被“拉伸”,当以某种方式保存切片时)

尽管如此,看拉伸的图片还是让我很恼火,我刚刚实现了一些调整大小cv2

def saveSlice(img, fname, path):
    img=numpy.uint8(img*255)
    fout=os.path.join(path, f'{fname}.png')
    img = cv2.resize(img, dsize=(IMAGE_WIDTH, IMAGE_HEIGTH), interpolation=cv2.INTER_LINEAR)
    cv2.imwrite(fout, img)
    print(f'[+] Slice saved: {fout}', end='\r')

结果非常好,对我来说效果很好。

于 2021-04-03T14:58:36.793 回答