无法将 DICOM 的图像数据输入图像数据生成器
Cannot feed image data of DICOM into image data generator
所以我预处理了一些 dicom 图像以提供给神经网络,并且在图像增强步骤中,图像数据生成器需要 4d 输入,而我的数据是 3d (200, 420, 420)
我尝试重塑数组并扩大维度,但在这两种情况下我都无法绘制数组中的单个图像(期望形状为 420、420 的图像,而我的新图像的形状为 420、420、1)
这是我的代码;
我有三个函数可以将DICOM图像转换成对比度好的图像;
这个需要 housefield 单位
def transform_to_hu(medical_image, image):
intercept = medical_image.RescaleIntercept
slope = medical_image.RescaleSlope
hu_image = image * slope + intercept
return hu_image
这个设置 window 个图像值;
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
returns (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
它returns
(ValueError: ('Input data in "NumpyArrayIterator" should have rank 4. You passed an array with shape', (162, 420, 420)))
我尝试了 expand_dims 并重塑以在数组末尾添加一个额外的维度来表示通道
但后来 returns
TypeError: Invalid shape (420, 420, 1) for image data
在plt.imshow
阶段
我是一名医生而不是经验丰富的程序员,所以非常感谢您的帮助。干杯。
您添加额外的维度来表示频道是正确的。那部分似乎很好。问题在于绘图。为此,您可以使用:
plt.matshow(x[..., 0]).
其中 x
是 3D 数组。语法 x[..., 0]
表示取数组 x
最后一维的索引 0。省略号(...
)是shorthand来填充维度。对于 3D 数组,等效调用为 x[:, :, 0]
.
所以我预处理了一些 dicom 图像以提供给神经网络,并且在图像增强步骤中,图像数据生成器需要 4d 输入,而我的数据是 3d (200, 420, 420)
我尝试重塑数组并扩大维度,但在这两种情况下我都无法绘制数组中的单个图像(期望形状为 420、420 的图像,而我的新图像的形状为 420、420、1)
这是我的代码;
我有三个函数可以将DICOM图像转换成对比度好的图像;
这个需要 housefield 单位
def transform_to_hu(medical_image, image):
intercept = medical_image.RescaleIntercept
slope = medical_image.RescaleSlope
hu_image = image * slope + intercept
return hu_image
这个设置 window 个图像值;
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
returns (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
它returns
(ValueError: ('Input data in "NumpyArrayIterator" should have rank 4. You passed an array with shape', (162, 420, 420)))
我尝试了 expand_dims 并重塑以在数组末尾添加一个额外的维度来表示通道 但后来 returns
TypeError: Invalid shape (420, 420, 1) for image data
在plt.imshow
阶段
我是一名医生而不是经验丰富的程序员,所以非常感谢您的帮助。干杯。
您添加额外的维度来表示频道是正确的。那部分似乎很好。问题在于绘图。为此,您可以使用:
plt.matshow(x[..., 0]).
其中 x
是 3D 数组。语法 x[..., 0]
表示取数组 x
最后一维的索引 0。省略号(...
)是shorthand来填充维度。对于 3D 数组,等效调用为 x[:, :, 0]
.