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

使用pydicom加载图像无法应用/更改colormap的问题

问题描述

设置colormap后完全不起作用,最终得到蓝色调图像。尝试用convert_color_space()将图像转为RGB色彩空间,色彩空间虽已改变,但colormap仍然无效。

最小可复现示例:

import matplotlib.pyplot as plt
import pydicom
import numpy as np

filename = "89474521"
ds = pydicom.dcmread(filename)

# rgbarray = convert_color_space(ds.pixel_array, "YBR_FULL", "RGB") # 转为RGB空间(可选)

plt.imshow(ds.pixel_array[20], cmap="gray")
plt.show()

输入文件形状为(24, 768, 1024, 3),共24个切片,示例读取第20个切片。相关DICOM元数据如下:

Dataset.file_meta -------------------------------
(0002, 0000) File Meta Information Group Length  UL: 198
(0002, 0001) File Meta Information Version       OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID         UI: Ultrasound Multi-frame Image Storage
(0002, 0003) Media Storage SOP Instance UID      UI: 1.2.840.113654.2.70.1.10.403324.30000021031806133177600000162
(0002, 0010) Transfer Syntax UID                 UI: JPEG Baseline (Process 1)
(0002, 0012) Implementation Class UID            UI: 1.2.40.0.13.1.1.1
(0002, 0013) Implementation Version Name         SH: 'dcm4che-1.4.35'
-------------------------------------------------
(0028, 0002) Samples per Pixel                   US: 3
(0028, 0004) Photometric Interpretation          CS: 'YBR_FULL_422'
(0028, 0006) Planar Configuration                US: 0
(0028, 0008) Number of Frames                    IS: '24'
(0028, 0009) Frame Increment Pointer             AT: (0018, 1065)
(0028, 0010) Rows                                US: 768
(0028, 0011) Columns                             US: 1024
(0028, 0100) Bits Allocated                      US: 8
(0028, 0101) Bits Stored                         US: 8
(0028, 0102) High Bit                            US: 7
(0028, 0103) Pixel Representation                US: 0
(0028, 0301) Burned In Annotation                CS: 'NO'
(0028, 0303) Longitudinal Temporal Information M CS: 'MODIFIED'
(0028, 2110) Lossy Image Compression             CS: '01'
(0028, 2112) Lossy Image Compression Ratio       DS: [14, 1.5]
(0028, 2114) Lossy Image Compression Method      CS: ['ISO_10918_1', 'RGB_TO_YBR']

显示结果为蓝色调的超声图像。

解决方法

matplotlib的imshow函数对3通道彩色图像会直接按RGB/YBR通道渲染,忽略colormap参数。要让colormap生效,必须先将3通道图像转换为单通道灰度图。

具体步骤:

  • 先将YBR_FULL_422格式的图像转换为RGB空间(使用pydicom的色彩空间转换工具)
  • 将RGB图像转换为单通道灰度图,采用标准的灰度转换公式:灰度值 = 0.2989*R + 0.5870*G + 0.1140*B
  • 用imshow显示灰度图并设置colormap

修改后的代码:

import matplotlib.pyplot as plt
import pydicom
import numpy as np
from pydicom.pixel_data_handlers.util import convert_color_space

filename = "89474521"
ds = pydicom.dcmread(filename)

# 1. 将YBR_FULL_422转换为RGB
rgb_array = convert_color_space(ds.pixel_array[20], "YBR_FULL_422", "RGB")

# 2. 转换为单通道灰度图
gray_array = np.dot(rgb_array[..., :3], [0.2989, 0.5870, 0.1140])

# 3. 显示灰度图并应用colormap
plt.imshow(gray_array, cmap="gray")
plt.show()

如果不需要保留原始色彩空间的转换,也可以直接从YBR通道提取亮度分量(Y通道)作为灰度图,这样更高效:

# 直接提取YBR的Y通道作为灰度图
y_channel = ds.pixel_array[20][..., 0]
plt.imshow(y_channel, cmap="gray")
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:57:23