在 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 数据集中的原始像素数据。
我想用 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 上做
- 创建一个
cv::Mat
具有足够深度来保存您的数据 - 如有必要,缩放
DicomImage::getDepth()
在单色 DICOM 图像上调用 DicomImage::getOutputData() 之前,您应确保已选择适当的 VOI 转换(例如 Window 中心和宽度)。这可以通过 DicomImage::setMinMaxWindow()、DicomImage::setWindow() 等来完成。请参阅 DicomImage class.
的文档但是请注意,DicomImage::getOutputData() 总是 returns 渲染像素数据,即不是存储在 DICOM 数据集中的原始像素数据。