我想用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查看器中,它看起来如下:
标准化后,灰色图像显示如下:
非常感谢任何帮助。
答案 0 :(得分:1)
我现在能看到的主要问题是像素值范围(深度)的差异。
AFAIK,DICOM可以有一个相当大的深度(16位),而你正试图融入CV_8U
,这只是8位。您可以使用DicomImage::getDepth()获取DicomImage
实例的深度,然后创建一个具有适当深度的cv::Mat
来保存您的图片数据。
您可能还需要规范化数据以最大限度地利用您的可用范围,以便cv::imshow()
的显示看起来像预期的那样。
所以:
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标头的完整信息。