首页 文章

验证DICOM文件

提问于
浏览
3

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

什么是最好的方式 .

我想到读取文件的几个字节并进行验证 .

要么

任何其他方法或我们验证的任何其他EXE .

哈萨,谢谢你

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

6 回答

  • 0

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

  • 1

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

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

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

    编辑:举个例子,考虑一个RAR档案 . 这很容易识别,因为它始于 Rar! . 但是,要确保它缓慢) .

  • 11

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

    ruslik的答案为您提供了识别DICOM文件的正确方法 . 如果它在文件前导码中的指定位置有DICM,则它是DICOM文件 . 否则,事实并非如此 .

  • 3

    我知道这已经得到了解答,但我有类似的要求,所以我掀起了一些扩展方法来做到这一点 . 适用于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
    
  • 4
    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
    
  • 4

    请注意:检查"DICM"的前导码将 only 检查该文件是否为DICOM v3 文件 .

    以前版本的DICOM没有序言 . 可查看的100%有效DICOM文件,包含所有必需的DICOM标记等,并且可导入DICOM节点,没有前导码 .

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

相关问题