在西门子DICOM标签中查找项目的大小



我正在尝试从C++中的西门子扫描仪读取多切片(Mosaic(DICOM图像,使用DCMTK读取nibel页面上的标签和信息。

据我所知,Mosaic图像有一个CSA标头,在8字节(CSA1(或16字节(CSA2(之后,包含结构

<TAG level>
tag name       [64x   uchar]
vm vr dt it mm [ 5x 4 bytes]
vm: [1x int32]: number of values
vr: [4x uchar]: 'value representation' string 
dt: [1x int32]: 'Syngo DT' Siemens version of vr
it: [1x int32]: number of items
mm: [1x int32]: 77 (ascii value for 'M' I guess, or 205 [+128])
<ITEM level>
a b c d      [ 4x 4 bytes]
a: [1x int32]: in CSA1: size Nitem in bytes + 'it' of first tag(?!)
b: [1x int32]: in CSA2: size Nitem in bytes
c: [1x int32]: 77 or 205 again, see above
d: [1x int32]: not used by nibabel
val          [Nitem bytes]: item value
padding      [nextw bytes]: start of next 4-byte word

它很特别。但可行。在CSA2中,编号abd将是相同的。

现在我已经找到了包含JSON结构的标签MrPhoenixProtocol。这不是问题(解析器很多(。上面描述的5个值是vm=1,vr='UN',dt=0,it=6,mm=77。it的值6很奇怪,但也出现在其他标签中(1个项目后面跟着5个空项目(。然后,对于第一个项目,abd为192,c为77,因此所有符号都表示项目大小为192字节。但这几乎没有达到JSON中的第一个参数,字段要大得多。因此,192字节只是项目/标签的一小部分,之后的检查显示值77或205没有被读取到它应该读取的位置。

在读取标记值之前,需要知道其数据的大小。但在这个MrPhoenixProtocol标签的情况下,如果它不在这些数字中(所以不是值192(,它可以用另一种方式计算吗?

编辑

函数csareader.py正确显示MrPhoenixProtocol标签。我添加了行

`print('{0} values: 1:{1}, 2:{2}, 3:{3}, 4:{4}, item_len: {5}'.format(name,x0,x1,x2,x3,item_len));

就在从缓冲区读取项目并打开我的DICOM图像之前。项目长度显示为139200个项目(在上面的示例中,abd将具有该值(,725乘以192(我读取的值(。完全困惑。

如果您还没有找到,您可以使用检查一个DICOM文件的CSA结构

$ gdcmdump --csa input.dcm

你应该得到这样的东西:

  • http://gdcm.sourceforge.net/wiki/index.php/SIEMENS_CSA_Header

可以在以下位置检查代码:

  • https://github.com/malaterre/GDCM/blob/v3.0.10/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx#L948

如果您只对"MrProtocol"小节感兴趣,可以使用:

$ gdcmdump --mrprotocol input.dcm

相关内容

  • 没有找到相关文章

最新更新