将 YBR_RCT 光度解释转换为 RGB

问题描述

我有一个 J2k Lossless dicom 图像,在使用 pydicom 读取它时,我看到它在 YBR_RCT 色彩空间中。

我想将色彩空间转换为 RGB。我尝试使用 pydicom 的 convert_color_space 方法,但显然没有实现这种转换。

在他们的文档中,他们提到 this link 作为他们实现其他转换的参考。该链接还提到了一些用于从 YBR_RCT 转换为 RGB 的公式。

我实现了这样的方程:

rgb_arr = np.zeros(orig_arr.shape).astype(np.float)
g = orig_arr[:,:,0] - np.floor((orig_arr[:,1]+orig_arr[:,2])/4)
r = g + orig_arr[:,2]
b = g + orig_arr[:,1]
rgb_arr[:,0] = r
rgb_arr[:,1] = g
rgb_arr[:,2] = b
rgb_arr = np.clip(rgb_arr,255).astype(orig_arr.dtype)

然而,在此之后,当我通过 plt.imshow() 可视化图像时,我发现它非常紫色。 我怀疑我所做的是否正确,而且我还没有真正找到可以进行这种转换的另一个包。

我尝试过使用 SimpleITK,但是我不清楚它是否进行了色彩空间转换。

如果您知道如何进行此转换,请告诉我。

解决方法

如果没有数据集很难判断,但鉴于 RCT 旨在无损可逆,以下内容应该足够了(不需要剪辑):

from pydicom import dcmread
import numpy as np

ds = dcmread("path/to/file")
arr = ds.pixel_array

rgb = np.empty(arr.shape,dtype=arr.dtype)
rgb[...,1] = arr[...,0] - np.floor((arr[...,1] + arr[...,2]) / 4)
rgb[...,0] = arr[...,2] + rgb[...,1]
rgb[...,2] = arr[...,1] + rgb[...,1]

但是当使用 pydicom 时,这一步应该不是必需的,因为各种像素数据处理程序在解码时都会隐式地执行 RCT 到 RGB 的转换。

,

我也有同样的问题。 使用 the link 中的公式产生奇怪的彩色图片 我不知道为什么,但如果我将 YBR_RCT 光度解释文件视为 RGB,它会产生可接受的颜色(虽然不那么亮......)

例如: 将 dicom 文件加载为 'RGB'

ds = pydicom.dcmread(file_path,force=True)
pixel_array = ds.pixel_array.astype(float) 

靠枕头展示,简单

from PIL import Image
display(Image.fromarray(np.uint8(pixel_array)))

要通过opencv保存图像,我们必须将pixel_array转换为BGR

import cv2
cv2.imwrite('E:\\test.jpg',cv2.cvtColor(np.float32(pixel_array),cv2.COLOR_RGB2BGR))
,

您应该考虑使用 SimpleITK。它建立在 GDCM 之上。 GDCM 将确保将 JPEG 2000 码流 / YBR_RCT 解压到 RGB 空间中的适当解压缓冲区。

请注意,这是 DICOM 标准规定的:

如果像素数据 (7FE0,0010) 以原生格式发送,则 光度解释 (0028,0004) 应不包括:

YBR_RCT