0

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

在此处输入图像描述

归一化后,灰度图像如下:

在此处输入图像描述

任何帮助将不胜感激。

4

3 回答 3

2

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

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

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

所以:

  • 在您DicomImage::getDepth()的 DCM_image 上执行
  • 创建一个cv::Mat具有足够深度来保存您的数据
  • 缩放,如有必要
于 2016-04-03T12:35:50.087 回答
0

在对单色 DICOM 图像调用 DicomImage::getOutputData() 之前,您应该确保选择了适当的 VOI 转换(例如窗口中心和宽度)。这可以通过 DicomImage::setMinMaxWindow()、DicomImage::setWindow() 等来完成。参见DicomImage类的文档。

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

于 2016-04-09T10:38:03.910 回答
-1

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

于 2016-04-03T10:02:04.423 回答