我想阅读C++中的DICOM图像,并使用opencv对它们进行操作。
我成功地使用DCMTK读取了一个dicom映像,但是我不知道如何将它转换为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查看器中,它看起来如下:
归一化后,灰度图像显示如下:
任何帮助都将不胜感激。
发布于 2016-04-03 12:35:50
我现在看到的主要问题是像素值范围(深度)的差异。
AFAIK,DICOM可以有一个相当大的深度(16位),您正在尝试适应CV_8U
,这是只有8位。您可以使用DicomImage
获取DicomImage::getDepth()实例的深度,然后创建一个具有适当深度的cv::Mat
来保存图像数据。
您还可能需要对数据进行规范化,以最大限度地利用可用范围,以便使用cv::imshow()
的显示看起来与预期的一样。
所以:
DicomImage::getDepth()
上做DCM_imagecv::Mat
发布于 2016-04-09 10:38:03
在对单色DICOM图像调用DicomImage::getOutputData()之前,您应该确保已经选择了适当的VOI转换(例如,窗口中心和宽度)。这可以由DicomImage::setMinMaxWindow()、DicomImage::setWindow()等完成。参见DicomImage类的文档。
但是,请注意,DicomImage::getOutputData()总是返回呈现的像素数据,即不是存储在DICOM数据集中的原始像素数据。
发布于 2016-04-03 10:02:04
您需要读取DICOM图像编码中的数据类型,并将其转换为opencv类型Mat。opencv文档提供了有关其Mat头的全部信息。
https://stackoverflow.com/questions/36379637
复制相似问题