- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在努力使用 DCMTK 3.6.1 库,现在我遇到了一种常见情况:访问 DICOM 图像的压缩数据像素。
正如图书馆的作者在这里建议的那样 http://support.dcmtk.org/redmine/projects/dcmtk/wiki/Howto_AccessingCompressedData ,这是获取压缩数据的正确方法。
此代码有效,但它们从文件开始创建数据集。在我的代码中,我以这种方式填充了我的数据集
status = data->putAndInsertUint8Array(DCM_PixelData, pSource, sizeBuffer);
其中 pSource 包含我未压缩的像素数据。在此之后,我添加图像 DICOM 标签(第 28 组)并使用
进行压缩status = data->chooseRepresentation(EXS_JPEGProcess14SV1, ¶m);
从这个数据集开始,我想访问压缩数据
status = data->findAndGetElement(DCM_PixelData, element);
DcmPixelData *dpix = NULL;
dpix = OFstatic_cast(DcmPixelData*, element);
/* Since we have compressed data, we must utilize DcmPixelSequence
in order to access it in raw format, e. g. for decompressing it
with an external library.
*/
DcmPixelSequence *dseq = NULL;
E_TransferSyntax xferSyntax = EXS_Unknown;
const DcmRepresentationParameter *rep = NULL;
// Find the key that is needed to access the right representation of the data within DCMTK
dpix->getOriginalRepresentationKey(xferSyntax, rep);
// Access original data representation and get result within pixel sequence
status = dpix->getEncapsulatedRepresentation(xferSyntax, rep, dseq);
Uint32 length;
if (status.good())
{
DcmPixelItem* pixitem = NULL;
// Access first frame (skipping offset table)
dseq->getItem(pixitem, 1);
if (pixitem == NULL)
return 1;
Uint8* pixData = NULL;
// Get the length of this pixel item (i.e. fragment, i.e. most of the time, the lenght of the frame)
length = pixitem->getLength();
if (length == 0)
return 1;
// Finally, get the compressed data for this pixel item
status = pixitem->getUint8Array(pixData);
// Metto i Pixel Data compressi su pSorgCompr
pSorgCompr = (LPBYTE)pixData;
}
////////////////////////////
DJEncoderRegistration::cleanup();
DJDecoderRegistration::cleanup();
但是 status = dpix->getEncapsulatedRepresentation(xferSyntax, rep, dseq); 行返回失败并显示错误“未找到像素表示”,我不明白为什么。
奇怪的事情是,如果在访问压缩数据之前,我用fileformat.saveFile("compressedPixelData.dcm", EXS_JPEGProcess14SV1); 保存压缩文件,然后下一步我使用 result = fileformat.loadFile("compressedPixelData.dcm"); 加载文件,一切正常
好像loadfile函数解决了这个问题,不知道怎么办,也许是填充了一些标签?
我在调用 chooseRepresentation 函数之前填写的标签是:
最佳答案
在 DICOM 中,压缩帧的存储方式不同于像素数据元素 (7FE0, 0010) 下的未压缩(原始)帧。这是 DICOM 中压缩图像编码的基本概念。
封装后的像素流(压缩图像数据)在顶层数据集的像素数据元素(7FE0,0010)下被分割成一个或多个片段(Items)。在封装编码中,像素数据元素是一个序列,它包含两个或多个项目元素(Fragments),每个片段(Item Element)都有自己明确的长度。此外,封装格式支持单帧和多帧图像编码。一个框架可以完全包含在一个片段(Item)中,也可以跨越多个片段。封装像素流的 Fragment 序列以定界符结束。
编码像素数据流之前的项目序列中的第一个项目(FFFE,E000)通常为空,或者可能包含一个基本偏移表项目,该项目保存每个帧的第一个片段的项目标签的第一个字节的字节偏移量在项目序列中。
因此,当您想从 DICOM Data Set 中提取压缩像素流时,您需要跳过 Pixel Data 序列下的第一个 Item 元素。我希望这有助于理解您引用的文档。请参阅 DICOM 标准 PS 3.5 附件 A 了解更多信息。
关于c++ - DICOM 访问压缩数据 (DCMTK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28219632/
我正在尝试将一个 DICOM 实例(在我的例子中是一个图像)从一个应用程序发送到一个服务器。但不知何故,它并没有发生。 日志显示某些标签丢失。 那么在 DICOM 关联(在我的例子中是 C-STORE
我所说的方向是指例如从患者的头部到底部或从他的底部到头部。到目前为止,我所看到的胸部 CT 扫描表明,实例编号 1 切片通常是从 body 上部向下的第一个切片,但我不知道这是标准的一部分还是我应该做
我知道单帧和多帧 dicom 图像文件。我想了解电影 dicom 图像,还有其他 dicom 图像格式。 最佳答案 正如您提到的,Alon 在他的评论中提到,DICOM 文件格式支持单帧和多帧像素数据
在处理 DICOM 研究、系列和媒体概念时,我想知道这些值是对所有数据都是唯一的,还是仅对它们所属的患者而言是唯一的。 换句话说;我可以让 2 名患者的研究/系列/sop 实例 uid 对这两名患者具
我有两个 图片 来自同一系列,但两个图像具有相同的 实例编号 6. 有可能吗????根据我的理解,系列实例编号对于该系列中的图像来说是唯一的。所以请帮助我......无论如何,是否可以从模态工作站??
我需要在像 firefox/chrome 这样的浏览器上显示 DICOM 图像。我遇到了这个名为 DWV 的查看器 - https://github.com/ivmartel/dwv . 我想知道是否
我遇到了在私有(private)标签中包含序列的 DICOM 对象;该序列中的每个项目都包含其自己的特定字符集 (0008,0005)。所有特定字符集元素都具有相同的值。 我还发现这些额外的特定字符集
如何识别 dicom 图像是否为压缩格式?还想知道如何读取压缩图像像素数据? 最佳答案 您可以使用命令行工具转储此类信息,例如 gdcminfo: $ gdcminfo 012345.002.050.
是否可以通过读取该研究中文件的 DICOM 头来找到 DICOM 研究中的图像数量? 我正在开发一个 Java 应用程序,它接收来自不同来源的 DICOM 研究。我只是想检查一份研究是否已经完全收到。
我必须从文件夹中选择所有有效的 DICOM 文件。我可以递归地从具有 *.DCM 扩展名的文件夹中选择所有文件。但是任何带有 *.DCM 的文件也会被拾取,并且此类文件不是有效的 DICOM 文件。
我有一堆 DICOM 冠状图像,我使用图像位置(患者)(0020,0032) 标签按正确的顺序对图像进行排序。 然而,该堆栈还包含一个“概述”图像,显示如何从轴向堆栈生成冠状切片 - 请参阅附件。 显
我一直在处理每个大约 4 MB 的 dicom 文件,但我最近收到了一些每个 280 KB 的文件。我不确定这是因为它们来自不同的 CT 扫描仪,还是新的 dicom 在给我之前被压缩了。有没有办法找
为了创建匿名化/去识别化工具,我想从 DICOM 文件中删除/覆盖所有不必要的标签/属性。我在互联网上搜索过,但没有找到 DICOM 文件必须使用哪些标签的明确列表。 我发现有多种类型,类型1是强制的
我有一堆 DICOM 冠状图像,我使用图像位置(患者)(0020,0032) 标签按正确的顺序对图像进行排序。 然而,该堆栈还包含一个“概述”图像,显示如何从轴向堆栈生成冠状切片 - 请参阅附件。 显
我一直在处理每个大约 4 MB 的 dicom 文件,但我最近收到了一些每个 280 KB 的文件。我不确定这是因为它们来自不同的 CT 扫描仪,还是新的 dicom 在给我之前被压缩了。有没有办法找
为了创建匿名化/去识别化工具,我想从 DICOM 文件中删除/覆盖所有不必要的标签/属性。我在互联网上搜索过,但没有找到 DICOM 文件必须使用哪些标签的明确列表。 我发现有多种类型,类型1是强制的
对不起,如果这是非常基本的,我是 DICOM 的新手。我知道 DICOM 文件有多个部分,例如:患者、研究、系列和实例(图像)。 现在要与设备通信,它需要一个传输语法,它告诉通信模式,如 Little
我在解释 DICOM 规范时遇到困难。具体来说,如果我有两个 DICOM 文件,每个文件都表示来自单个 CT 系列(同一研究)的独特 CT 切片。这两个文件都将包含 Patient 模块,因此理论上它
几天以来,我一直在使用 FO-DICOM 处理 DICOM 文件。 我正在使用一组 dicom 文件进行测试,并且我一直在打印“光度解释”和“每像素样本”值,以便更好地了解我正在处理的图像类型。 结果
AFAIK 没有 bool 值表示,我需要在私有(private)标记中指定 bool 值 true/false。 我想到了SH (短字符串),说 TRUE或 FALSE .是否有标准或广泛使用的方法
我是一名优秀的程序员,十分优秀!