【问题标题】:Cannot feed image data of DICOM into image data generator无法将 DICOM 的图像数据输入图像数据生成器
【发布时间】:2020-02-16 23:05:08
【问题描述】:

所以我已经预处理了一些 dicom 图像来馈送神经网络,并且在图像增强步骤中,图像数据生成器需要 4d 输入,而我的数据是 3d (200, 420, 420)

我尝试重塑数组并扩大尺寸,但在这两种情况下,我都无法绘制数组中的单个图像(预期图像的形状为 420、420,而我的新图像的形状为 420、420、1)

这是我的代码;

我有三个函数可以将 DICOM 图像转换为具有良好对比度的图像;

这个需要家庭单位

def transform_to_hu(medical_image, image):
    intercept = medical_image.RescaleIntercept
    slope = medical_image.RescaleSlope
    hu_image = image * slope + intercept

    return hu_image

这个设置窗口图像值;

def window_image(image, window_center, window_width):
    img_min = window_center - window_width // 2
    img_max = window_center + window_width // 2
    window_image = image.copy()
    window_image[window_image < img_min] = img_min
    window_image[window_image > img_max] = img_max

    return window_image

这个函数会加载图片:

def load_image(file_path):
    medical_image = dicom.read_file(file_path)
    image = medical_image.pixel_array

    hu_image = transform_to_hu(medical_image, image)
    brain_image = window_image(hu_image, 40, 80)
    return brain_image

然后我加载我的图像:

files = sorted(glob.glob('F:\CT_Data_Classifier\*.dcm'))
images = np.array([load_image(path) for path in files])

images.shape 返回 (200, 512, 512) 数据一切正常,例如我可以绘制第 100 张图像 plt.imshow(images[100]) 它会绘制图像

然后我将数据输入图像数据生成器

train_image_data = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.,
    zoom_range=0.05,
    rotation_range=180,
    width_shift_range=0.05,
    height_shift_range=0.05,
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='constant',
    cval=0

但是,当我尝试绘制时,使用以下代码:

plt.figure(figsize=(12, 12))
for X_batch, y_batch in train_image_data.flow(trainX, trainY, batch_size=9):
    for i in range(0, 9):
        plt.subplot(330 + 1 + i)
        plt.imshow(X_batch[i])
    plt.show()
    break 

返回

(ValueError: ('Input data in "NumpyArrayIterator" should have rank 4. You passed an array with shape', (162, 420, 420)))

我尝试了 expand_dims 和 reshape 以在数组末尾添加一个额外的维度来表示通道 但随后它返回

TypeError: Invalid shape (420, 420, 1) for image data

plt.imshow 阶段

我是一名医生,而不是经验丰富的程序员,所以我非常感谢您的帮助。干杯。

【问题讨论】:

  • 请看我的回答。一个问题:你在训练dicom的片段吗?或者你想训练体积数据?图像数据生成器适用于图像,而不是卷。
  • 你好 jakub,是的,我正在训练 DICOM 切片而不是体积数据。你知道一个很好的资源,我可以在其中学习如何在体积数据上训练模型吗?
  • 我在 tensorflow/keras 之上制作了一个框架,用于训练体积数据。 github.com/neuronets/nobrainer 但总的来说,我提到了关于这样做的博客文章和期刊文章。请尝试我链接到的框架,因为它旨在帮助那些不一定是经验丰富的程序员的人。如果您遇到问题或有疑问,请随时在 github 存储库上提交问题。
  • 哇你太棒了!!!非常感谢

标签: python arrays numpy rgb dicom


【解决方案1】:

您添加一个额外的维度来表示渠道是正确的。那部分似乎很好。问题在于绘图。为此,您可以使用:

plt.matshow(x[..., 0]).

x 是 3D 数组。语法x[..., 0] 表示取数组x 的最后一维的索引0。省略号 (...) 是填写尺寸的简写。对于 3D 数组,等效调用是 x[:, :, 0]

【讨论】:

  • 嗨 jakub,我试过这个解决方案,如果我单独使用 matshow 效果很好,但是我的代码中有一个函数,我使用 matplotlib 中的“subplot”函数,plt.subplot(330 + 1 + i) plt.matshow(X_batch[i],:,:,0) 它返回一个语法错误
  • plt.matshow(X_batch[i],:,:,0) 应该是 plt.matshow(X_batch[i,:,:,0])。这是一个微妙的区别。您需要将整个索引表达式包装在 [] 中。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2022-10-01
  • 2020-02-08
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多