Читайте DICOM на C++ и конвертируйте в OpenCV

Я хотел бы читать изображения 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 это выглядит следующим образом:

введите описание изображения здесь

После нормализации серое изображение выглядит следующим образом:

введите описание изображения здесь

Любая помощь будет принята с благодарностью.

3 ответа

Решение

Основная проблема, которую я вижу сейчас, - это разница в диапазонах значений пикселей (глубины).

AFAIK, DICOM может иметь довольно большую глубину (16 бит), и вы пытаетесь вписаться в CV_8U, который только 8 бит. Ты можешь получить DicomImage глубина экземпляра с помощью DicomImage:: getDepth (), а затем создать cv::Mat с соответствующей глубиной для хранения данных вашего изображения.

Вам также может потребоваться нормализовать данные, чтобы максимально использовать доступный вам диапазон, чтобы на дисплее cv::imshow() будет выглядеть как ожидалось.

Так:

  • Делать DicomImage::getDepth() на вашем DCM_image
  • Создать cv::Mat с достаточной глубиной для хранения ваших данных
  • Масштаб, если необходимо

Прежде чем вызывать DicomImage::getOutputData() для монохромного изображения DICOM, вы должны убедиться, что вы выбрали соответствующее преобразование VOI (например, Window Center & Width). Это может быть сделано с помощью DicomImage::setMinMaxWindow(), DicomImage::setWindow() и т. Д. См. Документацию по классу DicomImage.

Обратите внимание, однако, что DicomImage::getOutputData() всегда возвращает визуализированные пиксельные данные, т.е. не исходные пиксельные данные, которые хранятся в наборе данных DICOM.

Вам нужно прочитать тип данных в DICOM-кодировке, конвертируя это в opencv-тип Mat. Документы opencv предоставляют всю информацию в заголовке Mat.

Другие вопросы по тегам