dcmtk解析多帧dicom文件

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

img


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

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接: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类型,以保证保存到文件中的像素值有效。


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