Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从数组中正确提取PNG格式的带标签掩码?_Python_Image Processing_Mask_Scikit Image_Nifti - Fatal编程技术网

Python 如何从数组中正确提取PNG格式的带标签掩码?

Python 如何从数组中正确提取PNG格式的带标签掩码?,python,image-processing,mask,scikit-image,nifti,Python,Image Processing,Mask,Scikit Image,Nifti,我有以下的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,

我有以下的
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

我假设,由于
数据的形状是(63063063045),这意味着有45个部分,每个是630x630,但我可能又错了。因此,我采取了一个相当中心的切片,在这一点上,中间可能会有一些东西,并且我强烈地把它转换成<代码> uTI8强>,并将其保存为PNG。p>
imsave('result.png', fdata[...,22].astype(np.uint8))
PNG是低对比度的,因为在0..255的刻度上所有值都小于4,所以我使用ImageMagick增加对比度,以便您可以看到它:

magick result.png -auto-level visible.png

您可以使用终端中的ImageMagick获取直方图并查看4个类别标签中每个类别标签的出现频率:

magick result.png -format "%c" histogram:info
样本输出

335942: (0,0,0) #000000 gray(0)      <--- there are 335,942 pixels=0
 26367: (1,1,1) #010101 gray(1)      <--- there are  26,367 pixels=1
 29419: (2,2,2) #020202 gray(2)
  5172: (3,3,3) #030303 gray(3)
335942:(0,0,0)#000000格雷(0)