验证DICOM文件

时间:2011-01-25 11:06:20

标签: dicom

我必须从文件夹中选择所有有效的DICOM文件。我可以递归地从文件夹中选择具有* .DCM扩展名的所有文件。但任何带有* .DCM的文件也会被拾取,并且此类文件无效DICOM文件。

什么是最好的方式。

我想过阅读文件的几个字节并进行验证。

我们拥有的任何其他方法或任何其他EXE验证。

谢谢你, 戒日

编辑:解决问题的方法: 我终于使用dcmftest.exe进行验证。希望我走上正轨。 -Harsha

6 个答案:

答案 0 :(得分:11)

您想识别DICOM文件,而不是验证。有很大的不同。验证意味着(至少!)它的SOP类所需的所有标签都存在。

识别很简单,因为DICOM文件必须在偏移量0x80处包含文本DICM,以便标记从文件的偏移量0x84开始。

请注意,有时只存储序列化数据集(从文件偏移0处的标记组8开始),这些数据集更难以识别,但不是标准的。

编辑:举个例子,考虑一个RAR档案。它很容易识别,因为它以Rar!开头。但是,为了确保它是一个有效的RAR存档,您必须解压缩所有文件并检查它们的CRC,这只能由RAR本身完成(而且速度很慢)。

答案 1 :(得分:4)

仅供参考,扩展名为.dcm的文件并不是真正合法的DICOM,但由于遗留原因,编写程序以接受它们是个好主意(但是你不应该在你输出的DICOM文件上放置3个字符的文件扩展名。应用)。根据有关媒体交换的DICOM标准部分,“不得使用ISO 9660文件扩展名”。此外,除了标准的第10部分和第12部分中描述的特殊DICOMDIR文件外,不应从文件名或目录结构中推断出语义。

ruslik的回答为您提供了识别DICOM文件的正确方法。如果它在文件前导码中的指定位置有DICM,则它是DICOM文件。否则,它不是。

答案 2 :(得分:4)

我知道这已经得到了解答,但我有类似的要求,所以我掀起了一些扩展方法来做到这一点。适用于Files,FileStreams,MemoryStreams和通用Streams。仅读取验证文件类型所需的特定4个字节。非常高效,我能在几秒钟内完成数千个文件。

<强> C#

public static class Dicom
{
    public static bool IsDicomFile(this Stream s)
    {
        //Create an empty 4 byte array
        byte[] dba = new byte[4];

        //Seek to 0x80
        s.Seek(128, SeekOrigin.Begin);

        //Read the following 4 dba
        s.Read(dba, 0, 4);

        //Compare to 'DICM'
        return dba.SequenceEqual(new byte[4] {68, 73, 67, 77});
    }

    public static bool IsDicomFile(this MemoryStream ms)
    {
        return ((Stream)ms).IsDicomFile();
    }

    public static bool IsDicomFile(this FileStream fs)
    {
        return ((Stream)fs).IsDicomFile();
    }

    public static bool IsDicomFile(this FileInfo fi)
    {
        return fi.OpenRead().IsDicomFile();
    }
}

<强> VB.NET

<Extension()> _
Public Function IsDicomFile(ByVal s As Stream) As Boolean
    'Create an empty 4 byte array
    Dim dba() As Byte = New Byte(3) {}

    'Seek to 0x80
    s.Seek(128, SeekOrigin.Begin)

    'Read the subsequent 4 bytes
    s.Read(dba, 0, 4)

    'Compare to 'DICM'
    Return dba.SequenceEqual(New Byte(3) {68, 73, 67, 77})
End Function

<Extension()> _
Public Function IsDicomFile(ByVal ms As MemoryStream) As Boolean
    Return DirectCast(ms, Stream).IsDicomFile
End Function

<Extension()> _
Public Function IsDicomFile(ByVal fs As FileStream) As Boolean
    Return DirectCast(fs, Stream).IsDicomFile
End Function

<Extension()> _
Public Function IsDicomFile(ByVal fi As FileInfo) As Boolean
    Return fi.OpenRead().IsDicomFile
End Function

答案 3 :(得分:3)

考虑到不同IOD中存在的不同强制和可选标签,验证DICOM文件并不是一件容易的事。我认为最好使用现有的解决方案来做到这一点。您可以查看DCMCHECK from DCMTK来执行此操作。

答案 4 :(得分:1)

For Java User
dcm4che-tool-dcmvalidate
usage: dcmvalidate --iod  [..][..]
Utility to validate DICOM objects according a specified Information Object
Definition.
-
Options:
 -h,--help             display this help and exit
    --iod    path to xml file with Information Object Definition
 -V,--version          output version information and exit
Example:
$ dcmvalidate --iod etc/dcmvalidate/dicomdir-iod.xml DICOMDIR

Validate DICOMDIR against IOD specified in etc/dcmvalidate/dicomdir.xml

Click Here for more Reference

答案 5 :(得分:0)

请注意:检查&#34; DICM&#34;的序言。将检查该文件是否为DICOM v3 文件。

以前版本的DICOM没有序言。 100%有效的DICOM文件,可以查看,包含所有必需的DICOM标签等,并可导入DICOM节点,不具备序言。

我正在检查OFFIS以查看DCMCHECK的许可版本是否也有此约束,但我还没有收到他们的回复。