V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sugarkeek
V2EX  ›  OpenCV

nii 文件用 opencv 转换为 mp4 视频画面失真,求教

  •  
  •   sugarkeek · 2023-02-12 11:11:21 +08:00 · 732 次点击
    这是一个创建于 679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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/")
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2871 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:18 · PVG 22:18 · LAX 06:18 · JFK 09:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.