我想知道哪种设置是最有效的方式。构建一个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。
是否有人开发了具有此类要求的应用程序?有没有其他方法可以尝试自动化此过程(例如,通过每个供应商/模型使用数据字典?)
任何人对此有一些粗略的主张或指导?
谢谢!
答案 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采集频率编码步骤中?