使用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
相关产品推荐
相关产品推荐

