用C ++读取DICOM并转换为OpenCV

时间:2016-04-02 22:53:58

标签: c++ opencv dicom mat dcmtk

我想用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));

导致以下结果:

enter image description here

在DICOM查看器中,它看起来如下:

enter image description here

标准化后,灰色图像显示如下:

enter image description here

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我现在能看到的主要问题是像素值范围(深度)的差异。

AFAIK,DICOM可以有一个相当大的深度(16位),而你正试图融入CV_8U,这只是8位。您可以使用DicomImage::getDepth()获取DicomImage实例的深度,然后创建一个具有适当深度的cv::Mat来保存您的图片数据。

您可能还需要规范化数据以最大限度地利用您的可用范围,以便cv::imshow()的显示看起来像预期的那样。

所以:

  • 在您的DCM_image上执行DicomImage::getDepth()
  • 创建一个具有足够深度的cv::Mat来保存您的数据
  • 必要时缩放

答案 1 :(得分:0)

在单色DICOM图像上调用DicomImage :: getOutputData()之前,应确保选择了适当的VOI转换(例如Window Center& Width)。这可以通过DicomImage :: setMinMaxWindow(),DicomImage :: setWindow()等来完成。请参阅DicomImage类的文档。

但请注意,DicomImage :: getOutputData()始终返回渲染的像素数据,即不是存储在DICOM数据集中的原始像素数据。

答案 2 :(得分:-1)

你需要读取DICOM图像编码中的数据类型转换为opencv类型的Mat。 opencv文档提供有关其Mat标头的完整信息。