0

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

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

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

//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。

有没有人开发过有这种要求的应用程序?有没有其他方法可以尝试和自动化这个过程(例如,通过使用每个供应商/型号的数据字典?)

有人对此有一些粗略的建议或指导方针吗?

谢谢!

4

1 回答 1

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包含适当属性值的类。另外,检查你的标签——飞利浦真的在 DICOM 属性 MR 采集频率编码步骤中保留了采集矩阵的 x 值吗?

于 2015-05-26T15:35:42.320 回答