我尝试从西门子的C++扫描仪读取多片DICOM图像,使用DCMTK读取标签和夜巴页上的信息。
据我所知,摩西图像有一个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中,数字a、b和d是相同的。
现在我已经到达了标记MrPhoenixProtocol,它包含一个JSON结构。这不是一个问题(解析器很多)。上面描述的5个值是vm=1,vr='UN',dt=0,it=6,mm=77。it的值6很奇怪,但也发生在其他标记中(1项,后面是5项空项)。然后对于第一项,a、b和d是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项(在上面的示例中,a、b和d将具有该值),725乘以192 (我读取的值)。完全不知所措。
发布于 2022-02-22 07:24:00
如果尚未找到它,可以使用以下方法检查一个DICOM文件的CSA结构:
$ gdcmdump --csa input.dcm你应该得到这样的东西:
该守则可在以下地点查阅:
如果您只对“MrProtocol”小节感兴趣,可以使用:
$ gdcmdump --mrprotocol input.dcmhttps://stackoverflow.com/questions/71206354
复制相似问题