董小姐~ 2023-04-25 17:10 采纳率: 0%
浏览 23

dcmtk解析多帧dicom文件

一个dicom文件包含多帧图像,并且每张图像的空间信息是保存在sequence中的,例如

img


该dicom文件包含11张图,每一张的窗位不一样?我该怎么把它每一个值都解析出来?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-26 09:58
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:6. DICOM图像显示-DCMTK-像素数据获取的三种方式和源码分析
    • 除此之外, 这篇博客: dcmtk读取DICOM并进行体绘制渲染中的 四、数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      赚点积分,没积分的留下邮箱,hhhh。

      DICOM_DARASET.zip-医疗文档类资源-CSDN下载
    • 以下回答来自chatgpt:

      针对该问题,需要从DICOM文件中获取每一帧图像的窗位信息,并进行调整。具体步骤如下:

      1. 使用DCMTK库中的DiImage类和DicomImage类读取DICOM文件,生成图像对象。
      DicomImage* dicomImg = new DicomImage(dcmDataSet, EXS_LittleEndianExplicit);
      
      1. 获取图像中每一帧的像素数据,并转换为灰度值(假设原图像为RGB彩色图像)。
      int size = dicomImg->getOutputDataSize(8);
      unsigned char *pixelDataRGB = new unsigned char[size];
      dicomImg->getOutputData(pixelDataRGB, size, 8);
      
      // 转换为灰度值
      unsigned char *pixelDataGray = new unsigned char[size / 3];
      for (int i = 0; i < size / 3; ++i) {
          pixelDataGray[i] = 0.299 * pixelDataRGB[3 * i] + 0.587 * pixelDataRGB[3 * i + 1] + 0.114 * pixelDataRGB[3 * i + 2];
      }
      
      1. 获取每一帧图像的窗位信息(假设该信息保存在(0028,1050)Window Center和(0028,1051) Window Width元素中)。
      OFString centerStr, widthStr;
      if (dcmElem->findAndGetOFString(DCM_WindowCenter, centerStr).good() &&
          dcmElem->findAndGetOFString(DCM_WindowWidth, widthStr).good()) {
          double center = atof(centerStr.c_str());
          double width = atof(widthStr.c_str());
      }
      
      1. 对每一帧图像进行窗位调整。
      int min = (2 * center - width) / 2.0 + 0.5;
      int max = (2 * center + width) / 2.0 + 0.5;
      for (int i = 0; i < size / 3; ++i) {
          if (pixelDataGray[i] < min)
              pixelDataGray[i] = 0;
          else if (pixelDataGray[i] > max)
              pixelDataGray[i] = 255;
          else
              pixelDataGray[i] = (pixelDataGray[i] - min) * 255 / width;
      }
      
      1. 将调整后的像素数据保存到文件中或用于后续处理。
      // 保存到文件中
      FILE *fp = fopen("output.dcm", "wb");
      fwrite(pixelDataGray, sizeof(unsigned char), size / 3, fp);
      fclose(fp);
      

      需要注意的是,对于RGB彩色图像,需要将三个颜色通道的值(R、G、B)按一定比例加权平均得到灰度值。在进行窗位调整时,需要将灰度值限制在0到255之间,并将调整后的值转换为unsigned char类型,以保证保存到文件中的像素值有效。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 4月25日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表