概述
有些dicom文件中会有一层蒙版,主要是在主台拍摄完后对图像做的近一步说明,这一块信息也是存在dicom
tag中的,本文就来说明一下overlay层的解析和显示
前提
让我们先看看overlay是啥,见下图
蓝色箭头指向的就是overlay层显示的东西
overlay显示主要需要以下几个字段(其他还有帧数,起始位置等,遇到了再说):
- (6000,0010) Overlay Rows
- (6000,0011) Overlay Columns
- (6000,0100) Overlay Bits Allocated
步骤
加载dicom文件
从dicom文件中取出overlay层的相关信息
将overlay层的像素信息绘制到图片上并保存到本地
具体实现
pom.xml:
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-core</artifactId>
<version>5.21.0</version>
</dependency>
<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>
java代码
public void overlayProcess(String strPath) throws IOException {
DicomInputStream in = new DicomInputStream(new File(strPath));
Attributes attr = in.readDataset(-1, -1);
if(attr == null) {
return;
}
int nOverlayRows = attr.getInt(Tag.OverlayRows, 0);
int nOverlayColumns = attr.getInt(Tag.OverlayColumns, 0);
int nOverlayBitsAllocated = attr.getInt(Tag.OverlayBitsAllocated, 0);
byte[] overlayData = attr.getBytes(Tag.OverlayData);
System.out.println(nOverlayRows+" "+nOverlayColumns+" "+nOverlayBitsAllocated+" "+overlayData.length);
BufferedImage BI = new BufferedImage(nOverlayColumns, nOverlayRows, BufferedImage.TYPE_4BYTE_ABGR);
for(int i=0;i<overlayData.length;i++) {
for(int k=0;k<8;k++) {
int b = ((overlayData[i]>>k)&0x1);
int value = 0;
if(b > 0) {
value = 0xff000000;
}else {
value = 0x00000000;
}
int rowIndwx = ((i*8)+k)/nOverlayColumns;
int colIndwx = ((i*8)+k)%nOverlayColumns;
BI.setRGB(colIndwx, rowIndwx, value);
}
}
ImageIO.write(BI, "png", new File("D:/dicomFile/test/overlay.png"));
System.out.println("end");
}
main方法
public static void main(String[] args) {
try {
process.overlayProcess("D:/dicomFile/test/overlay.dcm");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
结果
注意:overlay层的图像一般是透明的,是和原始dicom图像叠加显示在一块的。