【问题标题】:Read private dicom TAGS from various vendors - dcm4che2读取来自不同供应商的私有 dicom TAGS - dcm4che2
【发布时间】:2015-05-26 13:21:39
【问题描述】:

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

例如,目前我需要从 Siemens、GE 和 Philips 制造的 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。

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

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

谢谢!

【问题讨论】:

    标签: dicom medical dcm4che


    【解决方案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 Acquisition Frequency Encoding Steps 中保留了采集矩阵的 x 值吗?

    【讨论】:

    • 好的!非常感谢......遗憾的是这些过程没有真正记录在案。还有其他来源吗? dcm4che 有什么电子书、书籍吗?
    • 不,不幸的是,您被他们的网站 (dcm4che.org) 和各种类似的社区委员会所困。开源的诅咒……
    • 我会注意到,他们工具包中的工具(dcmsnd、dcm2jpg 等)是您使用该工具包进行的大多数活动的好例子。
    • 是的,我知道......经过一些挖掘后,我已经在我的项目中使用了其中一些(dcmsnd、dcmrcv 等):)......我想我将不得不再挖掘一些!您有使用商业 dicom 工具包的经验吗?最近我在看 Merge 的 dicom 工具包,我想知道它是否可以帮助我更快地开发我的应用程序!
    • 我已经很多年没有使用过商业广告了,但我知道 Merge 与他们的合作记录良好。
    猜你喜欢
    • 2012-10-03
    • 2023-02-07
    • 1970-01-01
    • 2015-08-25
    • 2013-11-15
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多