首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将dicom图像转换为opencv

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

Stack Overflow用户
提问于 2017-08-09 07:20:30
回答 2查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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/(266x425) == 2,所以它应该是像素前2个字节(?)

EN

回答 2

Stack Overflow用户

发布于 2017-08-09 14:02:37

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

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

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

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

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

-1

票数 1
EN

Stack Overflow用户

发布于 2017-08-10 21:50:16

问题是您是否真的需要DicomImage::getOutputData()返回的渲染像素数据,还是需要来自DICOM图像的原始像素数据(另请参阅@kritzel_sw的答案)。使用getOutputData()时,您应该将请求的位深度作为参数传递(例如,每个样本8位),而不是getDepth()返回的值。

在处理CT图像时,您可能希望使用Hounsfield单位(这是Modality LUT转换结果的有符号整数值)中的像素数据。

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

https://stackoverflow.com/questions/45579404

复制
相关文章

相似问题

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