You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提取DICOMDIR切片转MP4时视频静止偏黄的问题解决

问题分析与解决方案

核心问题定位

  • 视频静止:代码错误地仅保留第一帧并复制49次,未使用所有帧的原始数据
  • 黄色色调:DICOM灰度转RGB时颜色空间处理错误,且未考虑DICOM窗宽窗位,直接归一化导致颜色偏差

修正后的代码

import numpy as np
import pydicom
import os
import cv2

dicomdir_path = 'dcm_files/DICOMDIR'
dicomdir = pydicom.dcmread(dicomdir_path)

record = None
for record in dicomdir.DirectoryRecordSequence:
    if record.DirectoryRecordType == 'IMAGE' and record.InstanceNumber == 1:
        break

# 修正路径拼接逻辑,适配多层文件路径
filename = os.path.join(os.path.dirname(dicomdir_path), *record.ReferencedFileID)
ds = pydicom.dcmread(filename)

num_frames = ds.NumberOfFrames
pixel_data = ds.pixel_array

# DICOM窗宽窗位处理函数,还原临床视觉效果
def apply_windowing(pixel_array, ds):
    if 'WindowWidth' in ds and 'WindowCenter' in ds:
        window_width = float(ds.WindowWidth)
        window_center = float(ds.WindowCenter)
        lower = window_center - window_width / 2
        upper = window_center + window_width / 2
        pixel_array = np.clip(pixel_array, lower, upper)
    return pixel_array

# 逐帧处理:窗宽窗位+归一化
normalized_frames = []
for frame in pixel_data:
    frame_windowed = apply_windowing(frame, ds)
    frame_normalized = cv2.normalize(frame_windowed, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
    normalized_frames.append(frame_normalized)

pixel_data = np.array(normalized_frames)
print(f"帧数据形状:{pixel_data.shape}")

fourcc = cv2.VideoWriter_fourcc(*"mp4v")
# 兼容无CineRate字段的情况,默认25fps
fps = ds.get('CineRate', 25)
num_rows, num_cols = pixel_data.shape[1], pixel_data.shape[2]
video_writer = cv2.VideoWriter('Output/output.mp4', fourcc, fps, (num_cols, num_rows))

for frame in pixel_data:
    # 灰度转BGR(OpenCV VideoWriter默认使用BGR格式)
    frame_bgr = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
    video_writer.write(frame_bgr)

video_writer.release()

关键修改说明

  1. 修复视频静止

    • 删除pixel_data = pixel_data[0]和[pixel_data] * num_frames的错误代码,保留所有49帧的原始数据
    • 直接遍历原始帧数组生成视频
  2. 解决黄色色调

    • 改用cv2.COLOR_GRAY2BGR转换颜色空间:OpenCV视频写入默认使用BGR格式,之前的RGB转换会导致红蓝通道反转,出现黄色调
    • 新增窗宽窗位处理:DICOM原始像素值为线性数据,直接归一化会丢失细节,应用窗宽窗位后能得到符合视觉习惯的图像
  3. 鲁棒性优化

    • 修正路径拼接逻辑,支持多层嵌套的DICOM文件路径
    • 增加CineRate字段的兼容处理,避免字段缺失导致程序报错

内容的提问来源于stack exchange,提问作者user2381342

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:30:36