[我有以下file格式的Nifti
,其中包含掩码,我编写了以下代码以将内部图像提取为PNG
图像,问题是:
这是标记为[0。 1. 2. 3.],将遮罩另存为PNG
后,遮罩图像内的值将分布在[0-> 255]范围内,它们不只是像以前那样的4个标签!
我该如何解决这个问题?
唯一重要的是要在其中包含4个唯一标签。
预先感谢。
import nibabel as nib
import os
import glob
import numpy as np
from skimage.io import imread, imsave
#-------------------------------------------
# Multi Class Masks
path = 'Masks'
Dataset = glob.glob( os.path.join(path, '*.gz') )
ctr = 0
for image in Dataset:
# Load masks voxel
images = nib.load(image).get_fdata()
print(np.unique(images))
# Save it as PNG
ctr+=1
if(not os.path.exists('Dataset/masks/Case_'+str(ctr))):
os.mkdir('Dataset/masks/Case_'+str(ctr))
for _id in range(images.shape[2]):
imsave(os.path.join('Dataset/masks','Case_'+
str(ctr),str(ctr)+'_'+str(_id+1)+'.png'),
resize(images[:,:,_id],(256,256)))
#-------------------------------------------
imag = imread(os.path.join('Dataset/masks','Case_'+
str(ctr),str(ctr)+'_'+str(_id+1)+'.png'))
print(np.unique(imag))
只是警告您,我对Nifti数据一无所知,在这里可能是完全错误的……但是,我认为问题在于您这样做时:
fdata = nib.load(image).get_fdata()
您实际上得到了float64
数据类型:
print(fdata.dtype)
和PNG格式仅处理uint8
或uint16
,但不处理float64
。
[我假设data
的形状为(630,630,45),这意味着有45片物体,每片630x630,但同样,我可能是错的。因此,我根据中间部分进行了比较集中的分析,然后将uint8并保存为PNG。我使用PIL
是因为我更了解它,但是与skimage.io
Image.fromarray(fdata[...:22].astype(np.uint8)).save('result.png')
PNG是低对比度的,因为所有值在0..255的范围内都小于4,所以我用增加了对比度,以便您可以看到它:ImageMagick
magick result.png -auto-level visible.png