如何从数组中正确提取PNG格式的带标签的蒙版?

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

[我有以下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))
python image-processing mask scikit-image nifti
1个回答
0
投票

只是警告您,我对Nifti数据一无所知,在这里可能是完全错误的……但是,我认为问题在于您这样做时:

fdata = nib.load(image).get_fdata()

您实际上得到了float64数据类型:

print(fdata.dtype)

和PNG格式仅处理uint8uint16,但不处理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
enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.