在 C++ 中读取 DICOM 并转换为 OpenCV

Read DICOM in C++ and convert to OpenCV

我想用 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 查看器中,它看起来如下:

归一化后灰化后的图像如下:

如有任何帮助,我们将不胜感激。

您需要读取 DICOM 图像编码中的数据类型并将其转换为 opencv 类型 Mat。 opencv 文档提供了有关其 Mat header 的全部信息。

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

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

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

所以:

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

在单色 DICOM 图像上调用 DicomImage::getOutputData() 之前,您应确保已选择适当的 VOI 转换(例如 Window 中心和宽度)。这可以通过 DicomImage::setMinMaxWindow()、DicomImage::setWindow() 等来完成。请参阅 DicomImage class.

的文档

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