用Bokeh查看dicom图像

时间:2016-06-15 23:20:30

标签: python dicom bokeh

我正在尝试将图形背景设置为dicom图像。我跟着this example,但dicom.pixel_array给出的图像数据不是RGBA。我也不确定如何转换它。我也不确定散景的期待是什么。我已经尝试在文档中找到细节,但没有运气。

from bokeh.plotting import figure, show, output_file
import dicom
import numpy as np


path = "/pathToDicomImage.dcm"
data = dicom.read_file(path)
img = data.pixel_array

p = figure(x_range=(0,10), y_range=(0,10))

# must give a vector of images
p.image_rgba(image=[img], x=0, y=0, dw=10, dh=10)

output_file("image_rgba.html", title="image_rgba.py example")

show(p) 

此代码不会给我任何错误,但它不会显示任何内容。也许像素数组没有alpha数据,因此alpha默认为0?我不确定。另外,我无法弄清楚如何测试它。

解决

正如所指出的,我只需要将像素数据映射到rgba空间。对于这个例子,它意味着将数据复制到每个通道,并一直设置alpha。

def dicom_image_to_RGBA(image_data):
    rows = len(image_data)
    cols = rows
    img = np.empty((rows,cols), dtype=np.uint32)
    view = img.view(dtype=np.uint8).reshape((rows, cols, 4))
    for i in range(0,rows):
        for j in range(0,cols):
            view[i][j][0] = image_data[i][j]
            view[i][j][1] = image_data[i][j]
            view[i][j][2] = image_data[i][j]
            view[i][j][3] = 255
    return img

2 个答案:

答案 0 :(得分:0)

不是python的专家,我已经了解了pydicom处理像素数据的能力。我发现pixel_array是DICOM数据集的像素数据属性的值,因为并且pydicom没有提供将其转换为可以统一处理的某种标准格式的任何功能。这意味着在大多数情况下你必须将它转换为RGB,这是一个非常复杂且容易出错的任务。

在此考虑的事项:

  • 编码(Big / Little Endian,各种压缩方法,如JPEG,JPEG-LS,RLE,ZIP) - DICOM属性(0002,0010)TransferSyntaxUID
  • pixeldata的类型(灰度,RGB,...) - DICOM属性(0028,0004)PhotometricInterpretation,(0028,0103)PixelRepresentation
  • 在彩色图像的情况下:按照平面(RRRRR,...... GGGGG,..... BBBBB)或逐像素逐个编码的值(RGB RGB ...)
  • 位深度和哪些位用于实际像素数据值(0028,0100)BitsAllocated,(0028,0101)BitsStored,(0028,0102)Highbit。
  • 实际上是要显示的值的像素数据值,或者是颜色/灰度查找表的索引(0028,3000)ModalityLUTSequence,(0028,3002)LUTDescriptor,(0028,3003)LUTExplanation,(0028,3004) )ModalityLUTType,(0028,3006)LUTData。
可怕,不是吗?对于一些现代图像类,如增强型磁带,还有更多。

但是,如果您限制特定类型的图像(例如计算机射线照相术)。上述限制适用于使您的生活更轻松。

如果您要发布图像标题的DICOM转储,我可以给您一些提示如何显示该特定图像。

HTH

kritzel

答案 1 :(得分:0)

您需要做的是将pixel_array返回的像素数据映射到RGB空间。通常使用查找表(LUT)完成。在dicomparser库的dicompyler-core模块中查看函数GetImage和GetLUTValue。

在GetLUTValue中,它将数据映射到8位灰度图像。如果要使用其他LUT,则需要相应地映射颜色空间。