gpt4 book ai didi

image - 如何正确地将dicom图像转换为opencv

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:55 24 4
gpt4 key购买 nike

我在将 .dcm 图像从 dcmtk 格式转换为 opencv 时遇到问题。我的代码:

DicomImage dcmImage(in_file.c_str());
int depth = dcmImage.getDepth();
std::cout << "bit-depth: " << depth << "\n"; //this outputs 10
Uint8* imgData = (uchar*)dcmImage.getOutputData(depth);
std::cout << "size: " << dcmImage.getOutputDataSize() << "\n"; //this outputs 226100
cv::Mat image(int(dcmImage.getWidth()), int(dcmImage.getHeight()), CV_32S, imgData);
std::cout << dcmImage.getWidth() << " " << dcmImage.getHeight() << "\n"; //this outputs 266 and 425

imshow("image view", image); //this shows malformed image

所以我不确定CV_32SgetOutputData 参数。我应该把什么放在那里?还有 226100/(266*425) == 2 所以它应该是 2 字节前像素 (?)

最佳答案

当 getDepth() 返回 10 时,这意味着每个像素有 10 位(很可能是灰度)。

根据 DICOM 图像的像素表示 (0x0028,0x0103),您必须为矩阵类型指定有符号或无符号的 16 位整数:CV_16UC2 或 CV_16SC2。

注意:由于只使用了 2 个字节的 10 位,您可能会在高 6 位中发现垃圾,在将缓冲区传递给 mat 之前应将其屏蔽掉。

更新:关于您的评论和您的源代码:

  1. DicomImage::getInterData()::getPixelRepresentation() 不返回在 DICOM header 中找到的像素表示,而是同时表示位深度和有符号/无符号的内部枚举。要获取 header 中的值 - 使用 DcmDataset 或 DcmFileFormat
  2. 我不是 openCV 专家,但我认为您正在对 16 位图像应用 8 位位掩码,这无法正常工作
  3. 位掩码应为 (1 >> 11) - 1

关于image - 如何正确地将dicom图像转换为opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com