При использовании этого кода я не получаю желаемый результат (см. Рисунок).
DicomImage *image = new DicomImage("/home/000001.dcm");
cv::Mat inputImage(int(image->getHeight()), int(image->getWidth()), CV_16UC1, (uchar*)image->getOutputData(16));
Поскольку изображение имеет глубину 17, и если изменить CV_16UC1 на CV_32xx, я получу бессмысленное изображение.
Очевидно, что 17 битам нужно более 16 бит, чтобы их правильно хранить.
Мой вопрос заключается в том, какой тип карты Opencv мне следует использовать (CV_32SC1, CV_32SC2, CV_32SC3, CV_32SC4 или другое), в чем разница между ними, нужно ли использовать битовую маску для предотвращения попадания мусора в остальные старшие биты и как я могу это сделать? сделай это?
Проблема с отображаемым изображением заключается не в глубине 16 против 17 бит (так как вы указали всегда получать 16 бит), а в том, что вы не выбрали соответствующее окно VOI, например, позвонив image->setMinMaxWindow()
до image->getOutputData()
,
Других решений пока нет …