概要
随着医疗影像的发展,影像设备拍摄的图像越来越大,越来越多,但医疗影像的存储成本是很高的(云存储就更不用说了),所以在存储的时候会先将医疗影像压缩,之后再存储,以节省存储成本,本文主要介绍dicom医疗影像的压缩。
一般来说dicom医疗影像的默认压缩协议Transfer Syntax UID是1.2.840.10008.1.2,这种是可以直接去pixelData字段拿去显示的,我们就要把这种dicom压缩成我们需要的压缩协议,压缩协议详情见DICOM之Transfer Syntax
具体代码实现(我们还是基于Maven工程进行说明)
1.在pom.xml里加入依赖的jar包:
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-imageio</artifactId>
<version>5.21.0</version>
</dependency>
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-imageio-opencv</artifactId>
<version>5.21.0</version>
<scope>runtime</scope>
</dependency>
2.在eclipse里加入依赖的opencv库
在eclipse里加入opencv的动态链接库(如果你是通过源码编译的dcm4che,在你编译的dcm4che-assembly\target\dcm4che-5.21.0-bin\dcm4che-5.21.0\lib路径下,要是直接从网上下的编译好的直接就在lib目录下)
3.java代码:
public class Dcm4cheTranscode {
private static List<Property> params = new ArrayList<Property>();
public static void main(String[] args) {
File src = new File("D:/dicomFile/test/src.dcm"); //带有压缩协议的dicom原始文件
File dest = new File("D:/dicomFile/test/des.dcm"); //解压成未压缩的dicom目标文件
try {
transcodeWithTranscoder(src, dest);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void transcodeWithTranscoder(File src, final File dest) throws IOException {
try (Transcoder transcoder = new Transcoder(src)) {
transcoder.setDestinationTransferSyntax("1.2.840.10008.1.2.4.51");
transcoder.setIncludeFileMetaInformation(true);
transcoder.setRetainFileMetaInformation(true);
Property p = new Property("compressionQuality", 0.5);//压缩率
params.add(p);
transcoder.setCompressParams(params.toArray(new Property[params.size()]));
transcoder.transcode(new Transcoder.Handler(){
@Override
public OutputStream newOutputStream(Transcoder transcoder, Attributes dataset) throws IOException {
return new FileOutputStream(dest);
}
});
} catch (Exception e) {
Files.deleteIfExists(dest.toPath());
throw e;
}
}
}
4.结果:
可以看见dicom文件大小有明显的缩小,但是要注意会有一定量的像素损失。