多张png合成为nii.gz

这段代码展示了如何使用Python将多张PNG图像按(h,w,c)维度组合成NII.gz文件。首先,定义了一个DataSet类,继承自torch.utils.data.Dataset,用于加载和转换图像。接着,遍历所有PNG图像,将其转换为Tensor并堆叠成一个3维数组。最后,使用nibabel库保存为Nifti1Image格式的nii.gz文件。该过程适用于灰度图像,对于RGB图像需要先将其转换为单通道。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将多张png图片按照(h, w, c)组装成nii.gz

import numpy as np
import nibabel as nib
from glob import glob
from torch.utils.data import Dataset
from torchvision import transforms


class DataSet(Dataset):  # 方便读数据
    def __init__(self, label_path):
        self.label_path = label_path
        self.transform = transforms.Compose([transforms.ToTensor()],)

    def __len__(self):
        return len(self.label_path)

    def __getitem__(self, idx):
        label = self.label_path[idx]
        label = Image.open(label)
        label = self.transform(label)
        return label


label_path = './label_test/1/*'
label_path = glob(label_path)
dataset = DataSet(label_path)
label = dataset[0]
z, x, y = label.shape
z = len(dataset)  # 通道数
allImage = np.zeros([x, y, z], dtype='uint8')
# print(x, y, z)
for i in range(z):
    label = dataset[i]
    singleImage = label.numpy()
    allImage[:, :, i] = singleImage
# print(allImage.shape)
new_image = nib.Nifti1Image(allImage, np.eye(4))
nib.save(new_image, 'data2.nii.gz')

(适用于灰度图像,RGB图像需转为单通道)

image = Image.open(singleImage).convert('L')

参考:
1.https://blog.youkuaiyun.com/weixin_40519315/article/details/106022220?spm=1001.2014.3001.5501

2.https://blog.youkuaiyun.com/u010882121/article/details/94336919?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162996141016780262532497%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162996141016780262532497&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v29_ecpm-1-94336919.first_rank_v2_pc_rank_v29&utm_term=png%E5%90%88%E6%88%90%E4%B8%BAnii&spm=1018.2226.3001.4187

### 将PNG图像转换为NIfTI压缩格式(nii.gz) 在医学图像处理领域,`.nii` 和 `.nii.gz` 文件是非常常见的数据存储格式。这些文件通常用于保存三维或四维的医学影像数据。如果需要将二维的 PNG 图像序列转换为 NIfTI 压缩格式(`.nii.gz`),可以按照以下方式实现。 #### 转换过程 1. **加载PNG图像** 使用 Python 的 `PIL` 或 `cv2` 库来读取一系列 PNG 图像,并将其转化为 NumPy 数组的形式。每张 PNG 图像代表一个切片,所有的切片共同构成最终的三维体积数据[^1]。 2. **构建三维数组** 将所有 PNG 切片按顺序堆叠起来形成一个三维数组。假设 PNG 图像是灰度图,则其形状为 `(height, width)`;当多个切片堆叠时,会得到一个形状为 `(depth, height, width)` 的三维数组[^3]。 3. **创建NIfTI对象并保存** 使用 `nibabel` 库中的 `nifti1.Nifti1Image` 类来创建一个新的 NIfTI 对象,并指定头信息(如体素大小)。最后调用 `save()` 方法将该对象保存为 `.nii.gz` 文件[^2]。 以下是完整的代码示例: ```python import os from PIL import Image import numpy as np import nibabel as nib def png_to_nii_gz(png_folder, output_file): """ Convert a series of PNG files into a single .nii.gz file. Parameters: png_folder (str): Path to the folder containing PNG images. output_file (str): Output path for the generated .nii.gz file. """ # 获取PNG文件列表并排序 png_files = sorted([f for f in os.listdir(png_folder) if f.endswith('.png')]) slices = [] for png_file in png_files: img_path = os.path.join(png_folder, png_file) img = np.array(Image.open(img_path).convert('L')) # 灰度化 slices.append(img) # 构建三维NumPy数组 volume = np.stack(slices, axis=0) # 创建NIfTI对象 affine_matrix = np.eye(4) # 默认仿射矩阵 nii_image = nib.Nifti1Image(volume, affine_matrix) # 保存为.nii.gz文件 nib.save(nii_image, output_file) # 示例调用 png_to_nii_gz('./path/to/pngs', './output/image.nii.gz') ``` 上述脚本实现了从 PNG 文件夹到单个 `.nii.gz` 文件的转换功能。注意,在实际应用中可能还需要调整仿射变换矩阵 (`affine`) 来匹配具体的坐标系需求。 --- #### 注意事项 - 如果输入的 PNG 是彩色图像而非灰度图像,则需先进行颜色空间转换操作。 - 在某些情况下,原始 PNG 数据可能存在不同的分辨率或者方向差异,因此建议统一标准化后再执行此流程。 - 头部元数据(header information)可以根据具体项目的需求进一步完善,比如设置像素间距、单位等参数。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值