使用默认图像阅读器加载 Nifti 图像
MONAI 根据支持的后缀并按以下顺序自动选择阅读器:
- 调用此加载程序时,用户在运行时指定的读取器。
- 注册读者从最新到列表中的第一个。
- 默认阅读器:(nii, nii.gz -> NibabelReader), (png, jpg, bmp -> PILReader), (npz, npy -> NumpyReader), (others -> ITKReader)。
API说明如下图:
#导入用到得module
import os
import shutil
import numpy as np
import itk
from PIL import Image
import tempfile
from monai.data import ITKReader, PILReader
from monai.transforms import (
LoadImage, LoadImaged, EnsureChannelFirstd,
Resized, EnsureTyped, Compose
)
from monai.config import print_config
print_config()
- 生成示例图像
tempdir = tempfile.mkdtemp()
test_image = np.random.rand(64, 128, 96)
filename = os.path.join(tempdir, "test_image.nii.gz")
itk_np_view = itk.image_view_from_array(test_image)
itk.imwrite(itk_np_view, filename)
- 加载图像文件
data, meta = LoadImage()(filename)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
加载多个Nifti图像列表形成多通道图像
加载文件列表,将它们堆叠在一起并添加一个新维度作为第一维度。
并使用第一张图像的元数据来表示堆叠结果。
- 生成一些示例图像
filenames = ["test_image.nii.gz", "test_image2.nii.gz", "test_image3.nii.gz"]
for i, name in enumerate(filenames):
filenames[i] = os.path.join(tempdir, name)
itk_np_view = itk.image_view_from_array(test_image)
itk.imwrite(itk_np_view, filenames[i])
请注意,输出数据形状为 (3, 96, 128, 64),表示三通道图像。
data, meta = LoadImage()(filenames)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
加载 DICOM 格式的 3D 图像
- 创建一个示例图像
filename = os.path.join(tempdir, "test_image.dcm")
dcm_image = np.random.randint(256, size=(64, 128, 96)).astype(np.uint8)
itk_np_view = itk.image_view_from_array(dcm_image)
itk.imwrite(itk_np_view, filename)
- 加载图像
data, meta = LoadImage()(filename)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
加载 DICOM 图像列表并将它们堆叠为多通道图像
加载文件列表,将它们堆叠在一起并添加一个新维度作为第一维度。
并使用第一张图像的元数据来表示堆叠结果。
- 创建示例图像
filenames = ["test_image-1.dcm", "test_image-2.dcm", "test_image-3.dcm"]
for i, name in enumerate(filenames):
filenames[i] = os.path.join(tempdir, name)
dcm_image = np.random.randint(256, size=(64, 128, 96)).astype(np.uint8)
itk_np_view = itk.image_view_from_array(dcm_image)
itk.imwrite(itk_np_view, filenames[i])
- 加载图像
data, meta = LoadImage()(filenames)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
加载 PNG 格式的 2D 图像
#Generate an image
test_image = np.random.randint(0, 256, size=[128, 256])
filename = os.path.join(tempdir, "test_image.png")
Image.fromarray(test_image.astype("uint8")).save(filename)
#Load the image
data, meta = LoadImage()(filename)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
使用指定的图像阅读器加载图像
并且我们可以为图像阅读器设置额外的参数,例如,为 ITKReader 设置 c_order_axis_indexing=True,此参数稍后将传递给 ITK read() 函数。
loader = LoadImage()
loader.register(ITKReader())
data, meta = loader(filename)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
加载图像并执行其他操作
一些图像阅读器可以在从文件中读取图像后支持额外的操作。
例如,我们可以为 PILReader 设置一个转换器:PILReader(converter=lambda image: image.convert(“LA”))。
loader = LoadImage(PILReader(converter=lambda image: image.convert("LA")))
data, meta = loader(filename)
print(f"image data shape:{data.shape}")
print(f"meta data:{meta}")
将 LoadImage 与其他Transform结合使用
transform = Compose([
LoadImaged(keys="image"),
EnsureChannelFirstd(keys="image"),
Resized(keys="image", spatial_size=[64, 64]),
EnsureTyped("image"),
])
test_data = {"image": filename}
result = transform(test_data)
print(f"image data shape:{result['image'].shape}")
print(f"meta data:{result['image_meta_dict']}")