我想知道哪种是设置和构建 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。
有没有人开发过有这种要求的应用程序?有没有其他方法可以尝试和自动化这个过程(例如,通过使用每个供应商/型号的数据字典?)
有人对此有一些粗略的建议或指导方针吗?
谢谢!