Читайте 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.