
nii 是一个 4d 的医学 ct 图像,尺寸为(高,宽,深度,时间)。
我的预期是, 取时间和另外两个维度,转换为一个 mp4 格式的视频。
我的思路,先将 nii 图片转换一个 2 维的数组,然后顺序拼成一个视频。
但是实际, 转换出来的视频画面失真,win11 系统播放器打开画面失真,qq 影音播放器打开提示视频失效。

https://1drv.ms/u/s!Ah4q2HtKB2AWg4NnYXaMslribNVlWw?e=D8ScIs
import os import cv2 import numpy as np def nii2imgs_dim(nii, dim) -> list: """ 将 nii 文件转换为多张图片,返回图片数组,不用中间保存,方便转换为视频 :param nii: nii 对象 :param dim: 要转换的维度 :return: 图片数组 """ imgs = [] data = nii for d3i in range(data.shape[3]): # 读取 3d 文件 d3img = data[:, :, :, d3i] # 获取 nii 文件的维度 d3img_shape = d3img.shape # 遍历每一张图片 for d2j in range(d3img_shape[2]): # 获取第 i 张图片 img = data[:, :, d2j, d3i] imgs.append(img) return imgs def imgs2mp4(img_list, save_path): """ 将图片数组转换为 mp4 :param img_list: 图片数组 :param save_path: 保存地址 :return: 空 """ # 判断 save_path 路径是否存在,如果不存在则创建 if not os.path.exists(save_path): os.makedirs(save_path) # 图片数组转换为 mp4 img, *imgs = img_list # *imgs 表示剩下的所有元素,img 表示第一个元素,目的是为了获取图片尺寸 print(img.shape) # img 转换为 float32 img = img.astype(np.float32) img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) height, width, layers = img.shape video = cv2.VideoWriter(save_path + "video.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 1, (width, height)) video.write(img) for img in imgs: img = img.astype(np.float32) img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) video.write(img) video.release() img = nib.load(file_path) data = img.get_fdata() # nii 转换为多张图片 imgs = nii2imgs_dim(data, 3) # 将图片数组转换为 mp4 imgs2mp4(imgs, "./tmp/")