Я хотел бы читать изображения DICOM в C ++ и манипулировать ими с помощью opencv.
Мне удалось прочитать изображение dicom с помощью DCMTK, однако я не уверен, как преобразовать его в OpenCV Mat.
Вот то, что я имею до сих пор:
DicomImage DCM_image("test.dcm");
cv::Mat image(int(DCM_image.getWidth()), int(DCM_image.getHeight()), CV_8U, (uchar*)DCM_image.getOutputData(8));
что приводит к следующему:
В средстве просмотра DICOM это выглядит следующим образом:
После нормализации серое изображение выглядит следующим образом:
Любая помощь будет принята с благодарностью.
Основная проблема, которую я вижу сейчас, — это разница в диапазонах значений пикселей (глубины).
AFAIK, DICOM может иметь довольно большую глубину (16 бит), и вы пытаетесь вписаться в CV_8U
, который только 8 бит. Ты можешь получить DicomImage
глубина экземпляра с использованием DicomImage :: getDepth (), а затем создать cv::Mat
с соответствующей глубиной для хранения данных вашего изображения.
Вам также может понадобиться нормализовать данные, чтобы максимально использовать доступный вам диапазон, чтобы на дисплее cv::imshow()
будет выглядеть как ожидалось.
Так:
DicomImage::getDepth()
на вашем DCM_imagecv::Mat
с достаточной глубиной для хранения ваших данныхПеред вызовом DicomImage :: getOutputData () для монохромного изображения DICOM необходимо убедиться, что вы выбрали соответствующее преобразование VOI (например, Центр окна & Ширина). Это может быть сделано с помощью DicomImage :: setMinMaxWindow (), DicomImage :: setWindow () и т. Д. См. Документацию DicomImage учебный класс.
Обратите внимание, однако, что DicomImage :: getOutputData () всегда возвращает визуализированные данные пикселей, то есть не оригинальные данные пикселей, которые хранятся в наборе данных DICOM.
Вам нужно прочитать тип данных в DICOM-кодировке, конвертируя это в opencv-тип Mat. Документы opencv предоставляют всю информацию в заголовке Mat.