2016-06-15 2 views
2

Я пытаюсь установить фон графика для изображения dicom. Я следовал this example, но данные изображения, полученные от dicom.pixel_array, не являются RGBA. Я не уверен, как его преобразовать. Я также не уверен, что именно ожидает боке. Я пробовал найти специфику в документации, но не такую ​​удачу.Просмотр изображения dicom с помощью Bokeh

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 по умолчанию 0? Я не уверен. Кроме того, я не могу понять, как это проверить.

решаемые

Как было отмечено, мне просто нужно, чтобы отобразить данные пикселя в RGBA пространстве. для этого экземпляра это означает дублирование данных по каждому каналу и настройку альфы полностью.

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 

ответ

0

Не будучи экспертом в python, я взглянул на возможности pydicom в обработке данных пикселей. Я понял, что pixel_array - это значение атрибута пиксельных данных для набора данных DICOM , равно, и pydicom не предлагает никаких функций для преобразования его в какой-то стандартный формат, который можно обрабатывать равномерно. Это означает, что вам придется преобразовать его в RGB в большинстве случаев, что является довольно сложной и подверженной ошибкам задачей.

вещей, чтобы рассмотреть в этом:

  • Кодирование (Большой/Little Endian, различные методы сжатия, как JPEG, JPEG-LS, RLE, ZIP) - атрибут DICOM (0002,0010) TransferSyntaxUID
  • Тип pixeldata (Grayscale, RGB, ...) - атрибут DICOM (0028 0004) PhotometricInterpretation, (0028,0103) PixelRepresentation
  • В случае цветных изображений: значения, закодированные на плоскости (RRRRR, ... ... GGGGG, ..... BBBBB) или цветным пикселем, как вы ожидаете, (RGB RGB ...)
  • Битовая глубина и биты используются для фактических значений пиксельных данных (0028, 0100). Биты. Выделенные, (0028,0101) BitsStored, (0028,0102) Highbit.
  • - значения значений пикселей действительно значения, которые должны отображаться, или они являются индексами в таблице поиска цветов/оттенков серого (0028,3000) ModalityLUTSequence, (0028,3002) LUTDescriptor, (0028,3003) LUTExplanation, (00283004)) ModalityLUTType, (0028,3006) LUTData.

Страшно, не так ли? Для некоторых современных классов изображений, таких как Enhanced MR, есть даже больше.

Однако, если вы ограничиваете изображение определенного типа (например, вычисленную радиографию). ограничения к вышеупомянутому применяются, которые делают вашу жизнь немного легче.

Если вы разместите дамп DICOM заголовка изображения, я могу дать вам несколько подсказок, как отображать это изображение.

НТН

kritzel

0

Что вам нужно сделать, это карта пиксельные данные возвращаются из pixel_array в RGB пространстве. Обычно это делается с помощью таблицы поиска (LUT).Взгляните на функции GetImage и GetLUTValue в модуле dicomparser в библиотеке dicompyler-core.

В GetLUTValue он отображает данные в 8-битное изображение в оттенках серого. Если вы хотите использовать другое LUT, вам нужно будет соответствующим образом сопоставить цветовое пространство.