阅读来自不同供应商的私有dicom TAGS - dcm4che2

时间:2015-05-26 13:21:40

标签: dicom medical dcm4che

我想知道哪种设置是最有效的方式。构建一个JAVA应用程序(使用dcm4che2工具包),以便能够以适当的方式识别和解析来自不同供应商的DICOM。

例如,目前我需要解析西门子,通用电气和飞利浦制造的MRI中的私人标签。我可以看到,即使是同一个供应商,相同私有标签的VR也存在差异。

目前我正在尝试使用下面列出的代码解析这些私有TAG:

//get acquisitionMatrixX of a DICOM file
public String getAcquisitionMatrixX(File file) throws IOException {

    String acquisitionMatrixX =null;
    String manufacturer = null;

    CheckIfIsDicom checkFile = new CheckIfIsDicom();

    if(checkFile.checkIfDicomObjectFileB(file)) {
        try {

            DicomObject dcmObj4;
            DicomInputStream din4 = null;
            din4 = new DicomInputStream(file);
            dcmObj4 = din4.readDicomObject();

            manufacturer = dcmObj4.getString(Tag.Manufacturer);

            if(manufacturer.contains("GE")) {                    
                acquisitionMatrixX = dcmObj4.getString(0X00181310, VR.US);
                log.info("GE machine |acquisitionMatrixX| --------- Value for tag: " + acquisitionMatrixX);
            } else if (manufacturer.contains("SIEMENS")) {
                //IN CASE OF some models VR.SH & UN
                acquisitionMatrixX = dcmObj4.getString(0X0051100b, VR.LO);
                log.info("SIEMENS machine |acquisitionMatrixX| --------- Value for tag: " + acquisitionMatrixX);
            } else if (manufacturer.toLowerCase().contains("PHILIPS".toLowerCase())) {
                acquisitionMatrixX = dcmObj4.getString(0X00189058, VR.US);
                log.info("PHILIPS machine |acquisitionMatrixX| --------- Value for tag: " + acquisitionMatrixX);
            } else {
                acquisitionMatrixX = "";
            }

            din4.close(); 
        }
        catch (IOException e) {
                e.printStackTrace();
        } finally {
            if("".equals(acquisitionMatrixX) || acquisitionMatrixX==null) {
                acquisitionMatrixX="-100000";
            } else {
            }
        }
    } else {
        log.info("### IS NOT DICOM! ####");
        log.info("Selected file is not a DICOM Object");
    }

    return acquisitionMatrixX;
}

但是我不认为这种解析来自不同供应商的DICOM标签的方式在代码/逻辑的一致性和维护方面是最有效的!

例如,在许多情况下,同一供应商的不同型号之间存在不同的VR。

是否有人开发了具有此类要求的应用程序?有没有其他方法可以尝试自动化此过程(例如,通过每个供应商/模型使用数据字典?)

任何人对此有一些粗略的主张或指导?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您已将私人代码添加到字典中(请参阅http://www.dcm4che.org/confluence/display/d2/Adding+private+tags+to+the+dictionary),您应该可以执行以下操作来获取采集矩阵:

short[] acq = dcmObj4.getShorts( Tag.AcquisitionMatrix, null );
if( null == acq ) {
  // Try Siemens Private Attribute
  int tagTest = dcmObj4.resolveTag( PrivateTag.SiemensAcquistionMatrix, dcmObj4.getPrivateCreator( PrivateTag.SiemensAcquistionMatrix) );
  if( tagTest == PrivateTag.SiemensAcquisitionMatrix ) {
    acq = dcmObj4.getShorts( PrivateTag.SiemensAcquistionMatrix, null );
    break;
  }
  // Try Philips Private Attribute
  :
}
return acq;

上面,我假设一个PrivateTag类包含适当的属性值。另外,检查您的标签 - 飞利浦是否真的将采集矩阵的x值保留在DICOM属性MR采集频率编码步骤中?