Использование изображений dicom с OpenCV в Python

Я пытаюсь использовать изображение dicom и манипулировать им с помощью OpenCV в среде Python. До сих пор я использовал библиотеку pydicom для чтения данных изображения dicom (.dcm) и использования атрибута массива пикселей для отображения изображения с использованием метода imshow OpenCV. Но на выходе просто пустое окно. Вот фрагмент кода, который я использую в данный момент.

import numpy as np
import cv2
import pydicom as dicom

ds=dicom.dcmread('sample.dcm')
cv2.imshow('sample image dicom',ds.pixel_array)

cv2.waitkey()

Если я распечатаю массив, который используется здесь, вывод будет отличаться от того, что я получил бы с обычным массивом numpy. Я также пробовал использовать метод imshow matplotlib, и он смог отобразить изображение с некоторыми искажениями цвета. Есть ли способ преобразовать массив в разборчивый формат для OpenCV?


person Mushfiq Alam    schedule 10.12.2018    source источник
comment
Вы пропустили вызов cv2.waitKey. Без него графический интерфейс не работает (читайте документацию).   -  person Dan Mašek    schedule 10.12.2018
comment
@DanMašek извините, я действительно использую этот метод, но его нет в этом фрагменте. окно появляется, но это пустое окно.   -  person Mushfiq Alam    schedule 10.12.2018
comment
@DanMašek, но я добавлю это в код, чтобы люди не поняли неправильно.   -  person Mushfiq Alam    schedule 10.12.2018
comment
Какой тип данных элементов массива numpy вы получаете? np.int16? Какой диапазон (минимальное/максимальное значение)? Он одноканальный?   -  person Dan Mašek    schedule 10.12.2018
comment
@DanMašek это на самом деле uint16   -  person Mushfiq Alam    schedule 10.12.2018
comment
Хорошо, а какое максимальное значение в массиве? Охватывают ли значения весь диапазон от 0 до 65535? Причина, по которой я спрашиваю, заключается в том, что для 16-битных изображений imshow просто делит все на 256, чтобы отобразить его. Если в исходном изображении используется только небольшая часть всего диапазона, результат будет почти полностью черным (или очень темно-серыми, которые очень трудно различить на глаз). Matplotlib выполняет более сложное отображение.   -  person Dan Mašek    schedule 10.12.2018
comment
@DanMašek изображение со слайда МРТ, поэтому само изображение имеет оттенки серого. значения, которые в настоящее время отображаются на выходе, являются только нулями. Я предполагаю, что это потому, что большая часть изображения черная.   -  person Mushfiq Alam    schedule 11.12.2018
comment
@DanMašek большое спасибо. Ваш предыдущий комментарий помог мне понять проблему, и я нашел решение. Выкладываю ниже.   -  person Mushfiq Alam    schedule 11.12.2018


Ответы (3)


Столкнулся с похожей проблемой. Используется exposure.equalize_adapthist() (источник). Полученное изображение не на сто процентов соответствует тому, что вы могли бы увидеть с помощью программы просмотра DICOM, но это лучшее, что мне удалось получить.

import numpy as np
import cv2
import pydicom as dicom
from skimage import exposure

ds=dicom.dcmread('sample.dcm')
dcm_sample=ds.pixel_array
dcm_sample=exposure.equalize_adapthist(dcm_sample)
cv2.imshow('sample image dicom',dcm_sample)

cv2.waitkey()
person Azizah Masturina    schedule 14.02.2020

Я нашел способ показать изображение. Как упомянул Дэн в комментариях, значение матрицы было уменьшено, и из-за функции imshow вывод был слишком темным для человеческого глаза. Итак, в конце концов, единственное, что мне нужно было сделать, это умножить все данные мата на 128. Теперь изображение отображается отлично. умножение матрицы на 255 переэкспонирует изображение и приводит к тому, что некоторые его особенности теряются. Вот исправленный код.

import numpy as np
import cv2
import pydicom as dicom

ds=dicom.dcmread('sample.dcm')
dcm_sample=ds.pixel_array*128
cv2.imshow('sample image dicom',dcm_sample)

cv2.waitkey()
person Mushfiq Alam    schedule 11.12.2018

Я не думаю, что это правильный ответ. Это работает для этого конкретного изображения, потому что большинство ваших значений пикселей находятся в нижнем диапазоне. Проверьте это OpenCV: как визуализировать изображение глубины. Это для С++, но легко адаптируется к Python.

person user2466766    schedule 13.06.2019