我尝试使用MATLAB' dicomanon
函数使用以下命令对一个DICOM文件进行匿名处理:
dicomanon(path_file_in, path_file_out);
我收到以下错误。
使用dicom_add_attr> validate_data(第118行)时出错
属性(7FE0,0010)的数据类型错误。
属性(7FE0,0010)对应于DICOM标头中的PixelData
元素,可以使用以下方法访问(在我的特定DICOM文件中,使用MATLAB' s dicominfo
函数后):
DcmHdr.IconImageSequence.Item_1
其中DcmHdr
是结构,从dicominfo
输出。
就我而言:
PixelData: [2048x1 uint16]
就价值表示(VR)而言,使用 OB 或 OW 编码存储PixelData
,因此我开始研究dicomanon
尝试理解在这种情况下使用哪个子功能(这有意义吗?)。
VR似乎是在dicom_convert_meta_to_attr.m
文件中确定的,特别是determine_VR
子功能(dicom_convert_meta_to_attr.m
的第44行)。在这种情况下,VR被确定为 OB 。
现在,VR为OB时接受的类型在dicom_add_attr.m
(dicomanon
的另一个子功能)的第354行中指定,它们是:
uint8
,int8
,logical
。正如我们在PixelData
之前看到的uint16
类型在这种情况下类似,这似乎是触发错误的原因。
我不确定这里发生了什么。我的DICOM文件有问题吗?其他功能如dicomread
或dicominfo
似乎在此文件中正常工作。函数isdicom
也返回1,因此MATLAB似乎认为这是一个有效的DICOM文件(?)。
如果有人能够了解这里发生的事情,我感激不尽。
EDIT1:忘了提及我使用R2015b。
EDIT2:在malat评论后编辑,见下文:
感谢您的评论,马拉特。如果您能就以下事项向我提出您的想法,我将不胜感激:
虽然我不完全确定这两种不同的像素数据元素之间的区别,但我明白你有两种不同的含义。我还使用MATLAB' dicomdisp
函数验证了这一点:
有趣的是,我采用了PixelData
元素(来自DcmHdr.IconImageSequence.Item_1
,如上所述)并将其转换为uint8
,这是VR为OB时接受的类型之一。然后我创建了一个修改过的DICOM文件(使用dicomwrite
)。此修改后的DICOM文件与原始文件之间的唯一区别是我将DcmHdr.IconImageSequence.Item_1.PixelData
转换为uint8
。然后在修改后的文件上重新运行dicomanon
没有错误。
另一点需要指出的是。正如我上面提到的,在我看来,VR被确定为 OB (使用dbstop
if error
发现此情况)。另一方面,gdcmdump
和dicomdisp
都显示VR OW (绿色矩形)。如果VR OW ,则不会出现错误,因为使用此VR,uint16
是有效类型。也许我离开但我想知道determine_VR
子功能是否错误地将VR确定为 OB ?
在修改后的DICOM文件上使用dicomread
(转换为uint8
后)会返回一个与转换前完全相同的图像(矩阵),所以我想我可以选择这个hack运行dicomanon
没有错误的目的。原始DICOM图像的文件大小为95KB,转换后为28KB,但图像本身似乎没有变化,以及DICOM标题。我必须丢失与图像图标相关的信息(无论这是什么!?)。有什么想法吗?
谢谢!