【问题标题】:Why do I get completely black labels when converting slices of nifty data to png images?为什么在将漂亮数据切片转换为 png 图像时会得到完全黑色的标签?
【发布时间】:2020-08-01 02:05:08
【问题描述】:

我对深度学习和图像分割任务还很陌生。

我想通过获取每个病例的中心 50 个切片,在 3D 漂亮数据(CT 扫描)上训练一个 2D unet。我将图像和标签保存为 png,但标签完全是黑色的。我的目标是在给定 CT 扫描切片 (X) 的情况下预测肿瘤区域 (Y)。

我做错了什么?

我的代码:

labels = []

for i in range (0,100):
  seg = Path("/content/drive/My Drive/")/"case_{:05d}".format(i) / "segmentation.nii.gz"
  seg = nib.load(seg)
  seg = seg.get_data()
  n_i, n_j, n_k = seg.shape
  seg = seg[int(((n_i-1)/2)-25):int(((n_i-1)/2)+25),:,:]

  for i in range(seg.shape[0]):
    labels.append((seg[i,:,:]))
    i+=1

labels = np.array(labels)

for i in range(labels.shape[0]):
    label = (labels[i,:,:])
    imsave('/content/drive/My Drive/labels/labels_slice_{:05d}.png'.format(i), label)
    i += 1

我对图片广告执行相同操作,获取以下 .png 文件: image_slice_00680

但对于标签,我只能得到一个全黑的图像。

图像和标签的数据类型分别是float64和uint16。

Example segmentation nifti file

【问题讨论】:

  • 加载 nifti 文件后打印出 seg.max() 会得到什么?此外,.get_data() 似乎已被弃用,而 nipy 现在使用 .get_fdata()。你能上传一个示例 nifti 文件来重现错误吗?
  • @jwitos 感谢您的评论。打印seg.max() 给出2.0here 你有一个例子。

标签: python image-segmentation unity3d-unet


【解决方案1】:

我在 3D Slicer 和 nipy 中检查了您的 nifti 文件,该文件非常好。在这个分割文件的 608 个切片中,只有第 181-397 个切片具有正值,因此您应该得到完全黑色的图像。

这个简短的 sn-p 让我可以在第 300 个切片中保存正例:

import nibabel
import matplotlib.pyplot as plt

seg = nibabel.load("D:/Downloads/segmentation.nii.gz")
data = seg.get_fdata()
layer = data[300,:,:]

plt.imsave("D:/Downloads/seg.png", layer, cmap='gray')

让我知道您是否可以使用上面的代码复制它?

另外,我知道这不是问题的一部分,但您应该强烈考虑使用 nifti(或 NRRD)格式,而不是将它们转换为 PNG 文件。

1) 当您保存为 PNG 时,您会从 CT 扫描中丢失大量信息。基本上,您正在重新调整 CT 值,其范围通常从 -2000 到 +2000 到 0-255 像素范围。

2) 与分段掩码类似,在您的 nifti 文件中,分段区域保存为“1”,背景保存为“0”。当您将其保存为 PNG 时,您会将其重新调整为 0-255,并且您必须再次将其转换回来以进行网络训练。

【讨论】:

  • 谢谢。我能够复制结果。我理解您的意思,并使用以下代码处理了掩码:masks = [] for i in range (0,25): b=[] msk = Path("/content/drive/My Drive")/"case_{:05d}".format(i) / "segmentation.nii.gz" b = nib.load(msk) b=b.get_fdata() print("mask case_{:05d}".format(i)) b=resize(b,(b.shape[0],128,128)) b=b[:,:,:] for j in range(b.shape[0]): masks.append((b[j,:,:])) masks=np.asarray(masks) 您是说这是一个好方法还是建议其他方法?
  • 您好,这取决于您最终要达到的目标。您在上一条评论中发布的代码有点令人困惑,因为 bmasks 矩阵似乎是相同的。另外,我会仔细检查 b 矩阵在调整大小后的外观。根据您使用的库(skimage?numpy?),它可以更改原始矩阵的值。
  • 如果您想通过电子邮件继续此对话,您可以通过 jwitos at gmail.com 与我联系。
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 2011-02-04
  • 2018-11-17
  • 2020-01-07
  • 2017-02-27
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多