首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中读取DICOM并转换为OpenCV

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

Stack Overflow用户
提问于 2016-04-02 22:53:57
回答 3查看 7K关注 0票数 0

我想阅读C++中的DICOM图像,并使用opencv对它们进行操作。

我成功地使用DCMTK读取了一个dicom映像,但是我不知道如何将它转换为opencv Mat。

以下是我到目前为止所掌握的情况:

代码语言:javascript
运行
复制
DicomImage DCM_image("test.dcm");
cv::Mat image(int(DCM_image.getWidth()), int(DCM_image.getHeight()), CV_8U, (uchar*)DCM_image.getOutputData(8));

其结果如下:

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

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

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-03 12:35:50

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

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

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

所以:

  • 在你的DicomImage::getDepth()上做DCM_image
  • 创建一个深度足以保存数据的cv::Mat
  • 如有必要,比例
票数 2
EN

Stack Overflow用户

发布于 2016-04-09 10:38:03

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-04-03 10:02:04

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36379637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档